【问题标题】:Removing lists from each cell in pandas dataframe从熊猫数据框中的每个单元格中删除列表
【发布时间】:2017-12-18 14:40:31
【问题描述】:

我有一个数据框,其中包含许多单个单元格中的列表。有些单元格没有列表,只是字符串,有些只是整数或数字。

我想删除数据框中的所有列表(当然保留列表中的值或字符串)。我该怎么办?

下面是两个数据框,一个是“原始数据”,其中包含列表、数字和字符串。第二个是我希望创建的干净数据。

最简单、最有效的方法是什么?

import pandas as pd

#create two dataframes, one called raw, one called end result
#raw data
raw_data = {'Name': [['W1'], ['W3'], ['W2'], ['W1'], ['W2'],['W3'],['G1']],
            'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1'],
        'DrillDate': [['01/01/2000'], 23, '04/01/2000', ['05/15/2000'], [''],[''],'02/02/2000']}
dfRaw = pd.DataFrame(raw_data, columns = ['Name','EVENT','DrillDate'])
dfRaw


# cleaned data
clean_data = {'Name': ['W1', 'W3', 'W2', 'W1', 'W2','W3','G1'],
            'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1'],
        'DrillDate': ['01/01/2000', 23, '04/01/2000', '05/15/2000', '','','02/02/2000']}
dfEndResult = pd.DataFrame(clean_data, columns = ['Name','EVENT','DrillDate'])
dfEndResult

【问题讨论】:

    标签: python list pandas dataframe


    【解决方案1】:

    使用 applymap 并在单元格值上使用 isinstance 检查类型。

    In [666]: dfRaw.applymap(lambda x: x[0] if isinstance(x, list) else x)
    Out[666]:
      Name EVENT   DrillDate
    0   W1    E1  01/01/2000
    1   W3    E2          23
    2   W2    E3  04/01/2000
    3   W1    E4  05/15/2000
    4   W2    E5
    5   W3    E6
    6   G1    E1  02/02/2000
    

    更新,如果您有空列表并想要空字符串输出。

    In [689]: dfRaw.applymap(lambda x: x if not isinstance(x, list) else x[0] if len(x) else '')
    Out[689]:
      Name EVENT   DrillDate
    0   W1    E1  01/01/2000
    1   W3    E2          23
    2   W2    E3  04/01/2000
    3   W1    E4  05/15/2000
    4   W2    E5
    5   W3    E6
    6   G1    E1  02/02/2000
    

    【讨论】:

    • 您好,谢谢,这很好用!但是在对我的真实数据进行测试后,我得到错误“列表索引超出范围”,“发生在索引(某些列名)”这是因为我实际上没有 [""] 列表单元格,我有 [] 代替。是否有更新可以使用 [] 而不是 [""]?
    • 更新为空列表。
    【解决方案2】:

    我更喜欢@JohnGalt 的回答……但是

    dfRaw.update(dfRaw.DrillDate[dfRaw.DrillDate.apply(type) == list].str[0])
    dfRaw.update(dfRaw.Name.str[0])
    
    dfRaw
    
      Name EVENT   DrillDate
    0   W1    E1  01/01/2000
    1   W3    E2          23
    2   W2    E3  04/01/2000
    3   W1    E4  05/15/2000
    4   W2    E5            
    5   W3    E6            
    6   G1    E1  02/02/2000
    

    【讨论】:

    • 您好,谢谢,这也有效,@JohnGalts 的答案很好,因为我不必提供特定的列名,但是......如下所述。我的真实数据在单元格中没有 [""],实际上只有 []。如果我将 [""] 更改为 [],则此方法有效。所以很好。谢谢。
    猜你喜欢
    • 2019-05-22
    • 2021-11-02
    • 2018-01-24
    • 2022-01-12
    • 1970-01-01
    • 2020-09-26
    • 2018-08-26
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多