以下是我正在处理的数据示例。
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
.
.
.
答案 0 :(得分:5)
将 groupby transform
与 first
一起使用。 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}
})
答案 1 :(得分:2)
您可以使用 .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
答案 2 :(得分:0)
您可以将 .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")
答案 3 :(得分:-5)
使用方法fillna...
DataFrameName.fillna(method="ffill")