如何仅在 pandas 中内爆(与爆炸相反)非空值。使用 pandas 分组依据将多行合并为单行

How to implode (reverse of explode) only non-null values in pandas. Merge multiple rows into single row using pandas group by

我正在研究 Python Pandas。

我有一个 pandas 数据框,其中包含这样的列:

ID Cities
1 New York
1 ''
1 Atlanta
2 Tokyo
2 Kyoto
2 ''
3 Paris
3 Bordeaux
3 ''
4 Mumbai
4 ''
4 Bangalore
5 London
5 ''
5 Bermingham

请注意列中的空单元格是空字符串 ('') 或 Nan 或 None。 (为简单起见,我们只说它们是空字符串 (''))。

我希望结果是这样的:

ID Cities
1 New York, Atlanta
2 Tokyo, Kyoto
3 Paris, Bordeaux
4 Mumbai, Bangalore
5 London, Bermingham

简而言之,我想按 ID 分组,然后获取列表(通过删除空字符串)。

我有一个示例代码,但它实际上给我的结果是空字符串,我想删除空字符串。

dataFrame.groupby(['ID'], as_index=False)
                  .agg({'Cities': lambda x: x.tolist()})

它给了我这样的结果:

ID Cities
1 New York, ,Atlanta
2 Tokyo, Kyoto,
3 Paris, Bordeaux,
4 Mumbai, , Bangalore
5 London, , Bermingham

但我不想要空字符串...

请帮帮我。

非常感谢你的帮助。

您可以尝试用NaN替换空字符串,然后将.dropna()添加到聚合lambda函数中,如下:

df['Cities'] = df['Cities'].replace('', np.nan)

(df.groupby('ID', as_index=False)
                  .agg({'Cities': lambda x: x.dropna().tolist()})
)

结果:

   ID                Cities
0   1   [New York, Atlanta]
1   2        [Tokyo, Kyoto]
2   3     [Paris, Bordeaux]
3   4   [Mumbai, Bangalore]
4   5  [London, Bermingham]

我们还可以在系列级别执行操作,通过 mask out the unneeded values like empty string (''), dropna to remove the missing/empty values, then groupby aggregate 转换为所需的任何类型,例如 list:

new_df = (
    df['Cities']
        .mask(df['Cities'].eq(""))  # Replace Empty String with NaN
        .dropna()  # Exclude NaN
        .groupby(df['ID'])  # Groupby ID
        .aggregate(list)  # Join Into List
        .reset_index()  # Convert Back to DataFrame
)

或按条件过滤掉不需要的行:

new_df = (
    # Filter out by condition
    df.loc[df['Cities'].ne("") & df['Cities'].notnull(), 'Cities']
        .groupby(df['ID'])  # Groupby ID
        .aggregate(list)  # Join Into List
        .reset_index()  # Convert Back to DataFrame
)

new_df:

   ID                Cities
0   1   [New York, Atlanta]
1   2        [Tokyo, Kyoto]
2   3     [Paris, Bordeaux]
3   4   [Mumbai, Bangalore]
4   5  [London, Bermingham]

设置:

import pandas as pd

df = pd.DataFrame({
    'ID': [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5],
    'Cities': ['New York', "", 'Atlanta', 'Tokyo', 'Kyoto', "", 'Paris',
               'Bordeaux', "", 'Mumbai', "", 'Bangalore', 'London', "",
               'Bermingham']
})