Pandas - 列A的总和,其中列B在列C中

时间:2017-09-21 15:56:34

标签: python pandas numpy

我有以下数据框。请注意,B列是一系列列表。这就是给我带来麻烦的原因

数据框1:

   Column A        Column B
0      10            [X]
1      20          [X,Y]
2      15        [X,Y,Z]
3      25            [A]
4      60            [B]

我想获取C列(下面)中的所有值,检查它们是否存在于B列中,然后将它们的值与A列相加。

DataFrame 2 :(所需输出)

   Column C        Sum of Column A
0       X                 45   
1       Y                 35
2       Z                 15
3       Q                  0
4       R                  0

我知道这可以使用for循环完成,但我正在寻找“pandonic方法”来解决这个问题。

3 个答案:

答案 0 :(得分:4)

更新

从第二个数据框开始,这是一个更短更快的答案

df2['C'].apply(lambda x: df.loc[df['B'].apply(lambda y: x in y), 'A'].sum())

原始答案

你首先可以正常化' B栏中的数据。

df_normal = pd.concat([df.A, df.B.apply(pd.Series)], axis=1)

    A  0    1    2
0  10  X  NaN  NaN
1  20  X    Y  NaN
2  15  X    Y    Z
3  25  A  NaN  NaN
4  60  B  NaN  NaN

然后使用stack和groupby获取查找表。

df_lookup = df_normal.set_index('A') \
                     .stack() \
                     .reset_index(name='group')\
                     .groupby('group')['A'].sum()

group
A    25
B    60
X    45
Y    35
Z    15
Name: A, dtype: int64

然后加入df2。

df2.join(df_lookup, on='C').fillna(0)

   C     A
0  X  45.0
1  Y  35.0
2  Z  15.0
3  Q   0.0
4  R   0.0

并在一行

df2.join(
    df.set_index('A')['B'] \
      .apply(pd.Series) \
      .stack() \
      .reset_index('A', name='group') \
      .groupby('group')['A'] \
      .sum(), on='C') \
   .fillna(0)

如果你想循环在这种情况下哪个不好

d = {}
for _, row in df.iterrows():
    for var in row['B']:
        if var in d:
            d[var] += row['A']
        else:
            d[var] = row['A']

df2.join(pd.Series(d, name='Sum of A'), on='C').fillna(0)

答案 1 :(得分:2)

根据您的示例数据:

df1=df.set_index('Column A')['Column B'].\
        apply(pd.Series).stack().reset_index().\
             groupby([0])['Column A'].sum().to_frame()
df2['Sum of Column A']=df2['Column C'].map(df1['Column A'])

df2.fillna(0)

Out[604]: 
  Column C  Sum of Column A
0        X             45.0
1        Y             35.0
2        Z             15.0
3        Q              0.0
4        R              0.0

数据输入:

df = pd.DataFrame({'Column A':[10,20,15,25,60],'Column B':[['X'],['X','Y'],['X','Y','Z'],['A'],['B']]})
df2 = pd.DataFrame({'Column C':['X','Y','Z','Q','R']})

答案 2 :(得分:-1)

我会使用像

这样的列表理解
df['result']=np.sum[(df['Column C'] in col['Column B'])*col['Column A'] for col in df]