如何仅在 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']
})
我正在研究 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']
})