在pandas中合并和减去DataFrame列?

11

我有一个类似于pandas DataFrame的数据结构:

col1  col2 col3 col5
NaN    1    2    8
2     NaN   4    8
4     NaN   4    8

我想要做两件事:

1)合并第一列和第二列:

newcol1 col3 col5
1       2    8
2       4    8
4       4    8

我尝试使用 .concat,但那只是连接了行。似乎我不能使用标准的 + 运算符来处理 NaN 值。

2) 从新列 1 和列 3 中减去列 5,以便得到:

newcol1    col3
-7         -6
-6         -4
-4         -4

尝试用这种方式实现:

dataframe[['newcol1', 'col2']] - dataframe['col5']

dataframe[['newcol1', 'col2']].subtract(dataframe['col5'])

但是两者都不起作用。

3个回答

13

要获取新的列,你可以使用 fillna(或者 combine_first):

df['newcol1'] = df.col1.fillna(df.col2)

然后进行减法时,使用sub函数并指定axis=0,因为我们希望在匹配标签时考虑行索引(而不是默认的列索引):

>>> df[['newcol1', 'col3']].sub(df['col5'], axis=0)
   newcol1  col3
0       -7    -6
1       -6    -4
2       -4    -4

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user1566200
@user1566200 - 这很奇怪,它应该返回正确的结果。您使用的是哪个版本的Pandas?df.col1.combine_first(df.col2)是否更好? - Alex Riley
@ajcr 那也可以达到同样的效果。我如何检查 pandas 的版本? - user1566200
@user1566200:如果您正在从同一DataFrame中减去列,我不确定为什么会出现该错误。它在您问题中的示例上是否正常工作? - Alex Riley
关于 fillna 的问题,我唯一能想到的可能原因是您的 DataFrame 具有重复的索引。如果您在同一个 DataFrame 中减去了列,那么减法不应该引发任何错误(...我不知道发生了什么...)。 - Alex Riley
显示剩余3条评论

5

这里有一种方法。

您可以通过sum(axis=1)创建newcol1

In [256]: df['newcol1'] = df[['col1', 'col2']].sum(axis=1)

In [257]: df
Out[257]:
   col1  col2  col3  col5  newcol1
0   NaN     1     2     8        1
1     2   NaN     4     8        2
2     4   NaN     4     8        4

然后在 axis=0 上使用 df.sub()
In [258]: df[['newcol1', 'col3']].sub(df['col5'], axis=0)
Out[258]:
   newcol1  col3
0       -7    -6
1       -6    -4
2       -4    -4

太奇怪了。当我执行上面的第一行时,我得到的是一个全为0的newcol1列。 - user1566200

1
In [58]:

df['newcol'] = df[['col1','col2']].sum(axis=1) - df['col5']
df['col3'] = df['col3'] - df['col5']
df
Out[58]:
   col1  col2  col3  col5  newcol
0   NaN     1    -6     8      -7
1     2   NaN    -4     8      -6
2     4   NaN    -4     8      -4

然后你可以删除col1和col2:

In [59]:

df = df.drop(['col1','col2'],axis=1)
df
Out[59]:
   col3  col5  newcol
0    -6     8      -7
1    -4     8      -6
2    -4     8      -4

这样可以正确进行减法,但是我的“newcol1”是一个NaN列。 - user1566200
2
为了让每个人能够复现这个问题,你需要发布完整的数据。 - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接