Pandas:用第一个非空值为用户填写列的值

以下是我正在处理的数据示例。

userID | preference
------------------- 
user1  | NaN
user1  | NaN
user1  | coffee
user2  | NaN
user2  | tea
user2  | NaN 
user3  | NaN 
user3  | NaN 
user3  | NaN 
.
.
.

某些用户缺少空首选项。我想用每个用户存在的第一个非空字符串填充首选项。我的最终 DataFrame 输出应如下所示

userID | preference 
-------------------
user1  | coffee
user1  | coffee
user1  | coffee
user2  | tea
user2  | tea
user2  | tea 
.
.
.
charlestri 回答:Pandas:用第一个非空值为用户填写列的值

groupby transformfirst 一起使用。 first 将获取每个组的第一个有效值(如果存在):

df["preference"] = df.groupby("userID")["preference"].transform('first')

df

  userID preference
0  user1     coffee
1  user1     coffee
2  user1     coffee
3  user2        tea
4  user2        tea
5  user2        tea
6  user3       None
7  user3       None
8  user3       None

DataFrame 和导入:

import pandas as pd
from numpy import nan

df = pd.DataFrame({
    'userID': {0: 'user1',1: 'user1',2: 'user1',3: 'user2',4: 'user2',5: 'user2',6: 'user3',7: 'user3',8: 'user3'},'preference': {0: nan,1: nan,2: 'coffee',3: nan,4: 'tea',5: nan,6: nan,7: nan,8: nan}
})
,

您可以使用 .groupby + Series.first_valid_index()

df["preference"] = df.groupby("userID")["preference"].transform(
    lambda x: x.fillna(x[x.first_valid_index()])
)
print(df)

打印:

  userID preference
0  user1     coffee
1  user1     coffee
2  user1     coffee
3  user2        tea
4  user2        tea
5  user2        tea
,

您可以将 .fillna 用于 first forward 和 back back。如果您的数据有空字符串而不是 NaN,则您必须首先使用 dataf = dataf.replace(r'^\s*$',np.nan,regex=True)

import pandas as pd

dataf["preference"] = dataf.groupby(by="userID")["preference"].fillna(method="ffill").fillna(method="bfill")
,

使用方法fillna...

DataFrameName.fillna(method="ffill")

本文链接:https://www.f2er.com/1009.html

大家都在问