【问题标题】:Merging and subtracting DataFrame columns in pandas?合并和减去熊猫中的DataFrame列?
【发布时间】:2015-07-02 04:05:28
【问题描述】:

我有一个 pandas DataFrame,类似于:

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

我想做两件事:

1) 合并第 1 列和第 2 列:

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'])

但两者都不起作用。

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    这是一种方法。

    您可以通过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
    

    【讨论】:

    • 太奇怪了。当我执行上面的第一行时,我得到 newcol1 作为全 0 的列。
    【解决方案2】:

    要获取新列,您可以使用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
    

    【讨论】:

    • 我一定是做错了什么——当我使用fillna时,它只是用col1替换了col2的所有行。
    • @user1566200 - 令人费解,它应该返回正确的结果。您使用的是哪个版本的熊猫? df.col1.combine_first(df.col2) 工作得更好吗?
    • 另外,使用 .sub 时出现错误:“操作数无法与形状 (320,) (80,) 一起广播”
    • @ajcr 做同样的事情。如何查看 pandas 版本?
    • @user1566200:如果您从同一个 DataFrame 中减去列,我不确定为什么会弹出该错误。它在您的问题中的示例上可以正常工作吗?
    【解决方案3】:
    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
    • 你必须发布完整的数据才能让每个人都复制这个
    猜你喜欢
    • 2018-03-07
    • 2020-10-08
    • 2021-10-27
    • 2020-01-05
    • 2019-02-05
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多