【问题标题】:How to split a list-column in a Pandas Dataframe based on a condition on the elements of the list?如何根据列表元素的条件拆分 Pandas Dataframe 中的列表列?
【发布时间】:2021-05-16 17:35:15
【问题描述】:

我有一个带有一列的 pandas DataFrame,比如:

df = pd.DataFrame({"combined_list": [["Netherlands|NL", "Germany|DE", "United_States|US", "Poland|PL"], ["Netherlands|NL", "Austria|AU", "Belgium|BE"], ["United_States|US", "Germany|DE"]]})

我想从combined_list 列创建两列:

  • 一个包含所有正常的国家名称(所以在最后一次出现 | 之前的所有内容)
  • 一列包含所有 2 个字母的缩写(这些缩写的长度始终为 2),所以基本上在最后一次出现 | 之后的所有剩余文本

生成的 Dataframe 应如下所示:

countries                                      abbreviations
[Netherlands, Germany, United_States, Poland]  [NL, DE, US, PL]
[Netherlands, Austria, Belgium]                [NL, AU, BE]
[United_States, Germany]                       [US, DE]

如何做到这一点?

我知道如果 Dataframe 的列只是一个字符串,我可以使用各种字符串拆分函数来实现它,但找不到列表列的任何内容

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:
    df_out = pd.DataFrame(
        df["combined_list"]
        .apply(lambda x: list(zip(*[s.split("|") for s in x])))
        .tolist(),
        columns=["countries", "abbreviations"],
    )
    print(df_out)
    

    打印:

                                           countries     abbreviations
    0  (Netherlands, Germany, United_States, Poland)  (NL, DE, US, PL)
    1                (Netherlands, Austria, Belgium)      (NL, AU, BE)
    2                       (United_States, Germany)          (US, DE)
    

    在列中有列表:

    df_out = pd.DataFrame(
        df["combined_list"]
        .apply(lambda x: list(map(list, zip(*[s.split("|") for s in x]))))
        .tolist(),
        columns=["countries", "abbreviations"],
    )
    print(df_out)
    

    打印:

                                           countries     abbreviations
    0  [Netherlands, Germany, United_States, Poland]  [NL, DE, US, PL]
    1                [Netherlands, Austria, Belgium]      [NL, AU, BE]
    2                       [United_States, Germany]          [US, DE]
    

    【讨论】:

    • 非常感谢您的努力!它就像一个魅力
    【解决方案2】:

    使用explode,然后通过groupby.agg 转换为数据框

    out_cols= ["countries", "abbreviations"]
    out =(df['combined_list'].explode().str.split("|",expand=True)
          .groupby(level=0).agg(list).set_axis(out_cols,axis=1))
    

    print(out)
    
                                           countries     abbreviations
    0  [Netherlands, Germany, United_States, Poland]  [NL, DE, US, PL]
    1                [Netherlands, Austria, Belgium]      [NL, AU, BE]
    2                       [United_States, Germany]          [US, DE]
    

    【讨论】:

    • 非常有用的解决方案! (到目前为止最好的恕我直言)但是第二个agg(list) 是错字吗?
    • @MustafaAydın 啊,是的,谢谢 :) 我会编辑的。
    【解决方案3】:

    这是另一个解决方案:

    df2 = pd.DataFrame()
    df2['Countries'] = df.apply(lambda row:[row['combined_list'][i].split('|')[0] for i in range(len(row['combined_list']))], axis=1)
    df2['Abbreviations'] = df.apply(lambda row:[row['combined_list'][i].split('|')[1] for i in range(len(row['combined_list']))], axis=1)
    
    print(df2)
    
                                           Countries     Abbreviations
    0  [Netherlands, Germany, United_States, Poland]  [NL, DE, US, PL]
    1                [Netherlands, Austria, Belgium]      [NL, AU, BE]
    2                       [United_States, Germany]          [US, DE]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-29
      • 2018-04-07
      • 2016-10-24
      • 2010-10-31
      • 1970-01-01
      • 2020-10-17
      • 2015-04-11
      • 2023-01-26
      相关资源
      最近更新 更多