【问题标题】:Extracting strings of a list in pandas column as integer or float将熊猫列中的列表字符串提取为整数或浮点数
【发布时间】:2018-11-26 07:06:19
【问题描述】:

我在 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”(本文中没有提到美元)。所有这些都是行

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

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

【问题讨论】:

标签: python string pandas


【解决方案1】:

您可以尝试以下操作,其中applyast.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

【讨论】:

    【解决方案2】:

    您可以将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
    

    【讨论】:

    • 我在您发帖后尝试了所有这些建议。对于第一个,我得到 ValueError: invalid literal for int() with base 10: ''。然后我尝试了 float 而不是 int。我得到了这个:ValueError:无法将字符串转换为浮点数:最后返回的 AttributeError:'list' 对象没有属性 'fillna'。可能,这是我的数据。因为我在做 NLTK,所以这些列表中可能有奇怪的值。不过感谢您的帮助。
    • @worthy,看起来你需要精确定义你的数据框;例如,尝试df.head().to_dict() 并将结果粘贴到您的问题中,您可以edit here
    • 我根据您的建议发布了其他结果。谢谢
    • @worthy,我已经更新了您提供的数据。
    猜你喜欢
    • 2017-09-17
    • 2019-02-05
    • 2020-03-07
    • 2018-01-02
    • 1970-01-01
    • 2019-05-14
    • 2013-10-02
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多