将pandas列中列表的字符串提取为整数或浮点数

时间:2018-06-16 23:13:41

标签: python string pandas

我在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" (这个没有提到的美元)。所有这些都是行

我创建了一个新列来表示所提到的美元价值。如上所述,我将叙述简化为数字。

另外,如果我可以提取每行所提及的总美元价值总和而不通过清理叙述(以避免潜在的问题),那也可以。我试图对原始叙述进行一些正则表达式,但未能提取{$}之间所示的金额 - 这就是每行叙述中美元价值的表示方式。

2 个答案:

答案 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