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