【问题标题】:How to separate nested comma separated column values in pandas data frame using python?python - 如何使用python分隔pandas数据框中的嵌套逗号分隔列值?
【发布时间】:2022-01-20 04:15:24
【问题描述】:

我有如下数据框

df 创建

df= pd.read_csv("dump12.csv")
df=df[['ID','linkedShipments','Status']]

df.dtypes()
ID                 object
linkedShipments    object
Status             object

df(输入数据)

ID Status     linkedShipments
12  Active   [{'SID': 'GBDXY551', 'Code': 'GBDXY55', 'Num': '2021121'}, {'SID': 'GBDXY551', 'Code': 'GBDXY55', 'Num': '20211215'}]
32  Expired  [{'SID': 'CHSGI422', 'Code': 'CHSGI421', 'Num': '4024421'}, {'SID': 'GBDXY551', 'Code': 'GBDXY55', 'Num': '20211222'}]
36  Expired  [{'SID': 'CHSGI428', 'Code': 'CHSGI907', 'Num': '4024568'}, {'SID': 'GBDXY556', 'Code': 'GBDXY55', 'Num': '20211333'}]

预期输出

ID  SID         Code     Num      Status
12  GBDXY551    GBDXY55  2021121  Active
12  GBDXY551    GBDXY55  20211215 Active
32  CHSGI422    CHSGI421 4024421  Expired
32  GBDXY551    GBDXY55  20211222 Expired
36  CHSGI428    CHSGI907 4024568  Expired
36  GBDXY556    GBDXY55  20211333 Expired

**My Current Code**

这仅适用于一个键,我还想将状态列添加到输出数据框,如何做到这一点。

#load as dataframe
df = pd.DataFrame(data)

new_data = {} #define new data
#treverse all rows in current data
for index, row in df.iterrows():
    #json only accept double quotes, so convert singal quotes to double quotes
    shipment_dict_list = json.loads(row['linkedShipments'].replace("\'", "\"")) 
    for shipment_dict in shipment_dict_list:
        new_data.setdefault("ID",[]).append(row['ID'])
        for key in shipment_dict:
            new_data.setdefault(key,[]).append(shipment_dict[key])
print(pd.DataFrame(new_data))

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这可以通过explodeapply(pd.Series) 的组合来实现:

    df2 = df.explode('linkedShipments').reset_index(drop = True)
    df2.join(df2['linkedShipments'].apply(pd.Series)).drop(columns = 'linkedShipments')
    

    输出:

    
        ID  Status  SID         Code        Num
    0   12  Active  GBDXY551    GBDXY55     2021121
    1   12  Active  GBDXY551    GBDXY55     20211215
    2   32  Expired CHSGI422    CHSGI421    4024421
    3   32  Expired GBDXY551    GBDXY55     20211222
    4   36  Expired CHSGI428    CHSGI907    4024568
    5   36  Expired GBDXY556    GBDXY55     20211333
    

    编辑

    我这样构建了df

    df = pd.DataFrame(columns = ['ID', 'Status', 'linkedShipments'], data = [
      [12,'Active',   [{'SID': 'GBDXY551', 'Code': 'GBDXY55', 'Num': '2021121'}, {'SID': 'GBDXY551', 'Code': 'GBDXY55', 'Num': '20211215'}]],
      [32,'Expired',  [{'SID': 'CHSGI422', 'Code': 'CHSGI421', 'Num': '4024421'}, {'SID': 'GBDXY551', 'Code': 'GBDXY55', 'Num': '20211222'}]],
      [36,'Expired',  [{'SID': 'CHSGI428', 'Code': 'CHSGI907', 'Num': '4024568'}, {'SID': 'GBDXY556', 'Code': 'GBDXY55', 'Num': '20211333'}]],
    ]
    )
    

    【讨论】:

    • 未按预期工作。它不会爆炸
    • @pankaj 我已经添加了你的 df 的构造,因为你没有提供 - 在这种情况下解决方案是否有效?如果是这样,请用您创建 df 的方式更新您的答案,以便我们了解它为什么不起作用
    • @piterberg,我用了你的结构,它奏效了。当我使用我的数据框时它不起作用。我在问题中添加了如何创建我的数据框df
    • @piterberg,当我在我的数据框上使用你的代码时,它不会爆炸
    • @pankaj 我需要“dump12.csv”才能运行您的代码,请发帖
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多