【问题标题】:Add values to one column of a pandas dataframe based on the values in another根据另一列中的值将值添加到熊猫数据框的一列
【发布时间】:2014-03-05 20:06:54
【问题描述】:

假设我有两个矩阵,一个原始矩阵和一个参考矩阵:

import pandas as pa
print "Original Data Frame"
# Create a dataframe
oldcols = {'col1':['a','a','b','b'], 'col2':['c','d','c','d'], 'col3':[1,2,3,4]}
a = pa.DataFrame(oldcols)
print "Original Table:"
print a

print "Reference Table:"
b = pa.DataFrame({'col1':['x','x'], 'col2':['c','d'], 'col3':[10,20]})
print b

表格如下所示:

Original Data Frame
Original Table:
  col1 col2  col3
0    a    c     1
1    a    d     2
2    b    c     3
3    b    d     4

Reference Table:
  col1 col2  col3
0    x    c    10
1    x    d    20

现在我想从原始表 (a) 的第三列 (col3) 中减去两个表的第二列匹配的行中的引用表 (c) 中的值。所以表二的第一行应该将值 10 添加到第三列,因为列是 col2 的表 b 的行是 'c' 在 col3 中的值是 10。说得通?下面是一些执行此操作的代码:

col3 = []
for ix, row in a.iterrows():
    col3 += [row[2] + b[b['col2'] == row[1]]['col3']]

a['col3'] = col3
print "Output Table:"
print a

产生以下输出:

Output Table:
  col1 col2  col3
0    a    c  [11]
1    a    d  [22]
2    b    c  [13]
3    b    d  [24]

我的问题是,有没有更优雅的方法来做到这一点?此外,“col3”中的结果不应该是列表。也欢迎使用 numpy 的解决方案。

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    我不太明白您对您要做什么的描述,但是您显示的输出可以通过首先合并两个数据框,然后进行一些简单的操作来生成;

    >>> df = a.merge(b.filter(['col2', 'col3']), how='left',
                     left_on='col2', right_on='col2', suffixes=('', '_'))
    >>> df
      col1 col2  col3  col3_
    0    a    c     1     10
    1    b    c     3     10
    2    a    d     2     20
    3    b    d     4     20
    
    [4 rows x 4 columns]
    >>> df.col3_.fillna(0, inplace=True) # in case there are no matches
    >>> df.col3 += df.col3_
    >>> df
      col1 col2  col3  col3_
    0    a    c    11     10
    1    b    c    13     10
    2    a    d    22     20
    3    b    d    24     20
    
    [4 rows x 4 columns]
    >>> df.drop('col3_', axis=1, inplace=True)
    >>> df
      col1 col2  col3
    0    a    c    11
    1    b    c    13
    2    a    d    22
    3    b    d    24
    
    [4 rows x 3 columns]
    

    如果b 中的col2 中的值不是唯一的,那么您可能还需要类似:

    >>> b.groupby('col2', as_index=False)['col3'].aggregate(sum)
    

    【讨论】:

    • 是的,这正是我想要做的!
    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 2022-01-23
    • 2017-04-14
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多