对PANDAS DataFrame“单元格”中的所有整数求和

时间:2017-09-02 16:53:58

标签: python python-3.x pandas

我有一个PANDAS DF对象,其中每个“单元格”是一个元组列表:

d = {"seen":[[('A', 4)], [], [('B', 4), ('C',3)], [('A', 1), ('C',4)]],\
 'unseen':[[('B', 2), ('C',2)], [('A', 4), ('B', 2), ('C',2)], [('A', 4)], 
[('C',1)]]}
df = pd.DataFrame(d)
df  

这是结果:

    seen                 unseen
0   [(A, 4)]            [(B, 2), (C, 2)]
1   []                  [(A, 4), (B, 2), (C, 2)]
2   [(B, 4), (C, 3)]    [(A, 4)]
3   [(A, 1), (C, 4)]    [(B, 1)]

我需要创建一个包含4列的新DF:每个元组列表的长度+每个单元格中所有数字的总和:

    seen_count    seen_sum    unseen_count    unseen_sum
0   1             4           2               4  
1   0             0           3               8  
2   2             7           1               4  
3   2             5           1               1  

我可以迭代行并计算每个“单元格”的长度(在这种情况下为列表),然后迭代每个列表中的元组并对数字求和......但我希望有更高效的方法然后这个。 任何想法?

3 个答案:

答案 0 :(得分:4)

让我们使用df.agg,lambda函数使用自定义名称,使用map join来展平多索引列。

count_f = lambda x: x.str.len()
count_f.__name__ = '_count'
sum_f = lambda x: sum(i[1] for i in x)
sum_f.__name__ = '_sum'

df2 = df.agg([count_f, sum_f])
df2.columns = df2.columns.map(''.join)
print(df2)

输出:

   seen_count  seen_sum  unseen_count  unseen_sum
0           1         4             2           4
1           0         0             3           8
2           2         7             1           4
3           2         5             1           1

答案 1 :(得分:0)

使用In [1346]: (df.applymap(lambda x: sum([t[1] for t in x])) .add_suffix('_sum') .join(df.applymap(len) .add_suffix('_count'))) Out[1346]: seen_sum unseen_sum seen_count unseen_count 0 4 4 1 2 1 0 8 0 3 2 7 4 2 1 3 5 1 2 1 即可

header("location: xxx");

答案 2 :(得分:0)

当您处理这么复杂的行集时,首先创建数据帧是没有意义的。首先使用自定义函数清理它,然后再从中创建数据框。以下是在创建数据框之前清理的说明:

import pandas as pd

# starting dictionary
d = {"seen":[[('A', 4)], [], [('B', 4), ('C',3)], [('A', 1), ('C',4)]],
     "unseen":[[('B', 2), ('C',2)], [('A', 4), ('B', 2), ('C',2)], [('A', 4)], [('C',1)]]
     }

# custom funcs
funcs = {'sum': lambda r: [sum(y[1] for y in x) for x in r],
         'count': lambda r: [len(y) for y in r]}

df = pd.DataFrame()
for k in d:
    for f in funcs:
        df["{k}_{f}".format(k=k, f=f)] = funcs.get(f)(d.get(k))

df

#    seen_count  seen_sum  unseen_count  unseen_sum
# 0           1         4             2           4
# 1           0         0             3           8
# 2           2         7             1           4
# 3           2         5             1           1