Pandas 基于dataframe中的其他类别值填充类别值的缺失值

Pandas 基于dataframe中的其他类别值填充类别值的缺失值,pandas,Pandas,我想用另一个类别上最频繁的值来填充Pandas数据框中类别值的缺失值。比如说, import pandas as pd import numpy as np data = {'type': ['softdrink', 'juice', 'softdrink', 'softdrink', 'juice','juice','juice'], 'product': ['coca', np.nan, 'pepsi', 'pepsi', 'orange','grape',np.nan],

我想用另一个类别上最频繁的值来填充Pandas数据框中类别值的缺失值。比如说,

import pandas as pd
import numpy as np
data = {'type': ['softdrink', 'juice', 'softdrink', 'softdrink',    'juice','juice','juice'],
    'product': ['coca', np.nan, 'pepsi', 'pepsi', 'orange','grape',np.nan], 
    'price': [25, 94, 57, 62, 70,50,60]}
df = pd.DataFrame(data)
df
导致

      price     | product   |   type    
0   25          |  coca     | softdrink   
1   94          |   NaN     | juice    
2   57          |   pepsi   | softdrink    
3   62          |   pepsi   | softdrink    
4   70          |   orange  | juice    
5   50          |    grape  | juice    
6   60          |   NaN     | softdrink    
首先,我使用groupby作为

df.groupby('type')['product'].value_counts()   
得到

type      |   product    
juice     |    grape  |   1    
          |   orange  |   1    
softdrink | pepsi     |   2    
          | coca      |   1    
Name: product, dtype: int64    
我想用“百事可乐”(最不常见的)填充第二行缺失的产品,但用“葡萄”填充“果汁”类别第6行缺失的值。 如果没有分类组,我的解决方案是按列查找最频繁的值,并将该值分配给缺少的值

df['product'].fillna(df['product'].value_counts().index[0],inplace=True)
由于命令返回值,我很难完成任务

df.groupby('type')['product'].value_counts()
是熊猫系列,可通过

df.groupby('type')['product'].value_counts()['softdrink']['pepsi']
我如何知道哪个产品+类别使用频率最高。

IIUC

使用
模式


数据输入

import pandas as pd
import numpy as np
data = {'type': ['softdrink', 'juice', 'softdrink', 'softdrink',    'juice','juice','softdrink'],
    'product': ['coca', np.nan, 'pepsi', 'pepsi', 'orange','grape',np.nan],
    'price': [25, 94, 57, 62, 70,50,60]}
df = pd.DataFrame(data)

解决方案

df.groupby('type').product.transform(lambda x: x.fillna(x.mode()[0]))

Out[28]: 
0      coca
1     grape
2     pepsi
3     pepsi
4    orange
5     grape
6     pepsi
Name: product, dtype: object

新df

df['product']=df.groupby('type').product.transform(lambda x: x.fillna(x.mode()[0]))
df
Out[40]: 
   price product       type
0     25    coca  softdrink
1     94   grape      juice
2     57   pepsi  softdrink
3     62   pepsi  softdrink
4     70  orange      juice
5     50   grape      juice
6     60   pepsi  softdrink

哇!模式真不错。我正计划做一些类似的事情,但没有比这更好的了。你能不能不要一直撤销我所有的格式?