繁体   English   中英

Pandas - 根据列对行进行分组并将 NaN 替换为非空值

[英]Pandas - Group Rows based on a column and replace NaN with non-null values

我正在尝试根据目标“分组依据”列在我的 dataframe 上使用字符串创建一些聚合。

想象一下,我有以下 dataframe 和 4 列:

在此处输入图像描述

我想根据列“Col1”对所有行进行分组,在 o NaN 组的情况下,其值不是 null。

想要的output是这样的:

在此处输入图像描述

我也尝试使用普通的:

import pandas as pd
from tabulate import tabulate

df = pd.DataFrame({'Col1': ['A', 'B', 'A'],
                   'Col2': ['X', 'Z', 'X'],
                   'Col3': ['Y', 'D', ''],
                   'Col4': ['', 'E', 'V'],})

print(tabulate(df, headers='keys', tablefmt='psql'))
df2 = df.groupby(['Col1'])
print(tabulate(df2, headers='keys', tablefmt='psql'))

但它没有对 NaN 值进行分组......

我怎样才能做到这一点?

谢谢!

如果可以简单地询问每个组的第一个非缺失值,请使用GroupBy.first

df = pd.DataFrame({'Col1': ['A', 'B', 'A'],
                   'Col2': ['X', 'Z', 'X'],
                   'Col3': ['Y', 'D', np.nan],
                   'Col4': [np.nan, 'E', 'V'],})


df2 = df.groupby(['Col1'], as_index=False).first()
print (df2)
  Col1 Col2 Col3 Col4
0    A    X    Y    V
1    B    Z    D    E

使用first()更简洁明了。 另一种但不太酷的方法是:

df.replace('', np.nan) \
.groupby('Col1', as_index=False) \
.fillna(method='bfill') \
.groupby('Col1') \
.nth(0)

Output:

Col1    Col2    Col3    Col4
A   X   Y   V
B   Z   D   E

甚至你可以使用head()而不是nth()

df.replace('', np.nan) \
.groupby('Col1', as_index=False) \
.fillna(method='bfill') \
.groupby('Col1') \
.head(1) \ 
.set_index('Col1')

Output:

Col1    Col2    Col3    Col4
A   X   Y   V
B   Z   D   E

只需在已经启动的 DataFrame 上使用 df.replace() 将它们替换为 np.nan

df.replace('', np.nan)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM