Py学习  »  Python

Python Pandas-Dataframe-根据另一列添加列,该列具有来自另两列的数学运算

Sara.SP92 • 3 年前 • 1128 次点击  

我有一个熊猫数据框,看起来像这样:

时间戳 位置 数据A 数据B 数据C
16508 法国 0.03 0.06 0.15
16510 英格兰 0.05 0.07 0.11
16515 英格兰 0.04 0.03 0.87

我想做的是:

  • 为“位置”列中的每个不同值添加一个新列。
  • 在这个新列中,添加数据A和数据B之间百分比的除法(数据A/B*100)。

预期产出将是:

时间戳 位置 数据A 数据B 数据C 去法国 去英国
16508 法国 0.03 0.06 0.15 50 0
16510 英格兰 0.05 0.07 0.11 0 71.42
16515 英格兰 0.04 0.03 0.87 0 133.33

我尝试了以下方法:

for column in data['Place'].unique():
    column_name = f'To {Place}'
    data[column_name] = data[data['Place'] == column]['Data A'].div(['Data B'])*100
    data[column_name].fillna(method='ffill', inplace=True)
    data[column_name].fillna(value=0, inplace=True)

但它不起作用。我得到一个“'list'对象没有属性'div'”错误。我尝试过其他不同的方法,但它们也不起作用。

谁能帮我一下吗?

提前谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133418
 
1128 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Scott Boston
Reply   •   1 楼
Scott Boston    3 年前

我会这样做:

df_ratio = ((df['Data A'].div(df['Data B'])*100).to_frame()
               .assign(col='To '+df['Place'])
               .set_index('col', append=True)[0]
               .unstack(fill_value=0))

pd.concat([df, df_ratio], axis=1))

输出:

   timestamp    Place  Data A  Data B  Data C  To England  To France
0      16508   France    0.03    0.06    0.15    0.000000       50.0
1      16510  England    0.05    0.07    0.11   71.428571        0.0
2      16515  England    0.04    0.03    0.87  133.333333        0.0
not_speshal
Reply   •   2 楼
not_speshal    3 年前

IIUC,你可以试试 pivot :

df["Ratio"] = df["Data A"].div(df["Data B"])

output = df.drop("Ratio", axis=1).join(df.pivot(None, "Place", "Ratio").mul(100).fillna(0).add_prefix("To "))

>>> output
     Place  Data A  Data B  Data C  To England  To France
0   France    0.03    0.06    0.15    0.000000       50.0
1  England    0.05    0.07    0.11   71.428571        0.0
2  England    0.04    0.03    0.87  133.333333        0.0