我在DF数据框中有A列。当前; y,它看起来像这样:
A
1 [32000, 56000, 12000]
2 [32000, 12000]
3 []
4 [25]
.
.
有些单元格是空列表。我想为每行提取值为整数或浮点数,并将总和值相加。我尝试这样做并得到以下信息:
[[float(i) for i in k] for k in DF['A'] ]
ValueError: could not convert string to float:
我想要的是什么:
A
1 100000
2 44000
3 0 and so on.
我根据建议发布了一些结果:
import ast
DF.A.apply(ast.literal_eval) (ValueError: malformed node or string: [])
DF.A.head().to_dict()
返回:
{0: [],
1: ['32000', '56000', '12000'],
2: [],
3: [],
4: ['2000', '1500', '1000', '10', '1000']}
注意:我从客户叙述中创建了数据框。我试图清理标点符号和不相关的字符。每行的叙述如下所示。
" XYZ foo bar foo XYZ {$ 130} XYX bar foo {$ 260}"要么 " XYZ bar foo" (这个没有提到的美元)。所有这些都是行
我创建了一个新列来表示所提到的美元价值。如上所述,我将叙述简化为数字。
另外,如果我可以提取每行所提及的总美元价值总和而不通过清理叙述(以避免潜在的问题),那也可以。我试图对原始叙述进行一些正则表达式,但未能提取{$}之间所示的金额 - 这就是每行叙述中美元价值的表示方式。
答案 0 :(得分:1)
您可以尝试以下操作,其中apply
带有ast.literal_eval
(如果'A'是列表的字符串表示形式),则字符串为list
。然后应用sum
:
import ast
df['A'] = df['A'].apply(ast.literal_eval) # iff A is string representation of list
df['A'].apply(sum)
结果:
1 100000
2 44000
3 0
4 25
Name: A, dtype: int64
答案 1 :(得分:0)
您可以将pd.Series.apply
与自定义函数结合使用,该函数将元素映射到int
,然后应用sum
。
df = pd.DataFrame({'A': [['32000', '56000', '12000'],
['32000', '12000'],
[],
['25']]})
df['A'] = df['A'].apply(lambda x: sum(map(int, x)))
print(df)
A
0 100000
1 44000
2 0
3 25
或者,您可以使用列表理解:
df['A'] = [sum(map(int, x)) for x in df['A']]
另一种解决方案是创建数值的数据框,然后在轴上求和:
df = pd.DataFrame(df['A'].values.tolist()).fillna(0).astype(int)\
.sum(axis=1)\
.to_frame('A')
使用更新后的系列数据,最后一个选项似乎可行:
s = pd.Series({0: [],
1: ['32000', '56000', '12000'],
2: [],
3: [],
4: ['2000', '1500', '1000', '10', '1000']})
res = pd.DataFrame(s.values.tolist()).fillna(0).astype(int)\
.sum(axis=1)\
.to_frame('A')
print(res)
A
0 0
1 100000
2 0
3 0
4 5510