pandas Python基于ID填充列值

tjvv9vkg  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(159)

我想按ID号填充“Col”中的na值。我已经尝试过groupby

df=pd.DataFrame({
    'ID':[1,2,1,2,1,2],
    'Col':['One','NaN','NaN','Two','NaN','NaN']
})

以下是预期输出:

df=pd.DataFrame({
    'ID':[1,2,1,2,1,2],
    'Col':['One','Two','One','Two','One','Two']
})

我知道这是一个简单的例子,但我希望您能给予我任何帮助。此外,我有一个100万行的 Dataframe ,所以任何时间效率将不胜感激
我尝试过的:

x=df_total[df_total['id'].astype(str)=='2']
buck_map = dict(x[~x['buckets'].isnull()][['id','buckets']].values)
x['buckets']=x['id'].map(buck_map)
knsnq2tg

knsnq2tg1#

您可以创建将ID值Map到填充值的字典:

fill_dict = df.groupby('ID')['Col'].last().to_dict()

然后使用字典将NaN值替换为fill值:

df['Col'] = df['Col'].fillna(df['ID'].map(fill_dict))
b91juud3

b91juud32#

您的问题比较含糊,因为有几种方法可以根据您的示例生成所需的输出。
假设您正在查找每个ID的“多数值”,并且NaN是要删除的实际float('NaN'),而不仅仅是字符串'NaN',那么下面的语句将非常有效:

def majority(s):
    return s.mode()[0]

newdf = df.assign(Col=df.groupby('ID')['Col'].transform(majority))

>>> newdf
   ID  Col
0   1  One
1   2  Two
2   1  One
3   2  Two
4   1  One
5   2  Two

注意:要确保'NaN'是nan而不是字符串,请先执行以下操作:

df = df.assign(Col=df['Col'].replace({'NaN': float('Nan')}))
s3fp2yjn

s3fp2yjn3#

不清楚您真正想要的是什么,以及是否只是转换和替换,还是需要groupby。假设您指的是列的字符串,并且您只想要替换,则需要一种将1转换为'One'的方法(最好使用字典),然后将其应用于每行。您可以用途:

import pandas as pd

df=pd.DataFrame({
    'ID':[1,2,1,2,1,2],
    'Col':['One','NaN','NaN','Two','NaN','NaN']
})

def func(row):
    d= {0: 'zero', 1:'One', 2:'Two'}
    if row['Col'] == 'NaN':
        val = d[row['ID']]
    else:
        val = row['Col']
    return val
 
df['Col'] = df.apply(func, axis = 1)

print(df)

其给出:

ID  Col
0   1  One
1   2  Two
2   1  One
3   2  Two
4   1  One
5   2  Two

相关问题