gpt4 book ai didi

python - Pandas 数据框中元素和子集的总长度

转载 作者:行者123 更新时间:2023-11-28 18:14:32 24 4
gpt4 key购买 nike

我如何计算数据框中的总元素数(包括子集)并将结果放入新列?

import pandas as pd
x = pd.Series([[1, (2,5,6)], [2, (3,4)], [3, 4], [(5,6), (7,8,9)]], \
index=range(1, len(x)+1))
df = pd.DataFrame({'A': x})

我尝试使用以下代码,但它在每一行中给出 2:

df['Length'] = df['A'].apply(len)

print(df)

A Length
1 [1, (2, 5, 6)] 2
2 [2, (3, 4)] 2
3 [3, 4] 2
4 [(5, 6), (7, 8, 9)] 2

然而,我想要得到的是:

                         A  Length
1 [1, (2, 5, 6)] 4
2 [2, (3, 4)] 3
3 [3, 4] 2
4 [(5, 6), (7, 8, 9)] 5

谢谢

最佳答案

给定:

import pandas as pd
x = pd.Series([[1, (2,5,6)], [2, (3,4)], [3, 4], [(5,6), (7,8,9)]])
df = pd.DataFrame({'A': x})

您可以编写一个递归生成器,为每个不可迭代的嵌套元素生成 1。沿着这些线的东西:

import collections 

def glen(LoS):
def iselement(e):
return not(isinstance(e, collections.Iterable) and not isinstance(e, str))
for el in LoS:
if iselement(el):
yield 1
else:
for sub in glen(el): yield sub

df['Length'] = df['A'].apply(lambda e: sum(glen(e)))

产量:

>>> df
A Length
0 [1, (2, 5, 6)] 4
1 [2, (3, 4)] 3
2 [3, 4] 2
3 [(5, 6), (7, 8, 9)] 5

这将适用于 Python 2 或 3。对于 Python 3.3 或更高版本,您可以使用 yield from 来替换循环:

def glen(LoS):
def iselement(e):
return not(isinstance(e, collections.Iterable) and not isinstance(e, str))
for el in LoS:
if iselement(el):
yield 1
else:
yield from glen(el)

关于python - Pandas 数据框中元素和子集的总长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49309256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com