使用pandas中的列进行操作

时间:2017-10-04 08:40:44

标签: python pandas

我的df看起来像这样:

   I_0 I_1 I_2 10 20 30 SF
q
0    2   3   4  5  1  1 0.2
1    5   4   3  4  7  8 0.3
2    4   8   7  9  8  7 0.4

我想对它进行操作,例如:

  • 通过SF
  • 对第10,20和30列进行繁殖
  • 从I_0,I_1和I_2中减去这些新列。

例如:

I_0 - (column 10 * SF)
I_1 - (column 20 * SF)
I_2 - (column 30 * SF)

然后将计算列重命名为I_0_sub,I_1_sub和I_2_sub。

到目前为止我已尝试过这个:

df = pd.merge(df1, df2, how = "left", left_index = True, right_index = True)
df["SF"] = df["I_q_2"] / df[10]
test = df.subtract(df2*SF, axis=0)
test.drop(labels=["10", "20", "30", "SF"], axis = "columns", inplace = True)
test = test.add_suffix("_sub")

获取NaN in df。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

使用filter选择列以I开头:

df1 = df.filter(regex='^I')
print (df1)
   I_0  I_1  I_2
q               
0    2    3    4
1    5    4    3
2    4    8    7

然后按子集选择列,按mul选择多个:

df2 = df[["10", "20", "30"]].mul(df["SF"], axis=0)
print (df2)
    10   20   30
q               
0  1.0  0.2  0.2
1  1.2  2.1  2.4
2  3.6  3.2  2.8

最后减去sub - 但列不同,因此将值转换为numpy array

df = df1.sub(df2.values, 0).add_suffix('_sub')
print (df)
   I_0_sub  I_1_sub  I_2_sub
q                           
0      1.0      2.8      3.8
1      3.8      1.9      0.6
2      0.4      4.8      4.2

如果两个df中的列名称不相同,则会NaN,因为数据未对齐:

print (df1.sub(df2, axis=0))
   10  20  30  I_0  I_1  I_2
q                           
0 NaN NaN NaN  NaN  NaN  NaN
0 NaN NaN NaN  NaN  NaN  NaN
2 NaN NaN NaN  NaN  NaN  NaN