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

时间:2021-08-01 18:10:32

标签: python pandas dataframe

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

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 
.
.
.

4 个答案:

答案 0 :(得分:5)

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}
})

答案 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")