pandas 用现有值替换NaN值的任何方法

edqdpe6u  于 2023-06-28  发布在  其他
关注(0)|答案(3)|浏览(119)

我正在Jupyter笔记本上处理一个数据集。我的数据集有两列,“州”和“城市”,如图所示

现在,State中有一些缺失的值,所以我想根据数据集中已经存在的数据填充NaN数据。

例如,在图2中,城市是Chennai,缺少州,所以我想在图1的州列中填充泰米尔纳德邦。
示例2-我想填写Andhra Pradesh的州,其中城市是Vishakapatnam等等,用于所有NaN数据。

6ovsh4lw

6ovsh4lw1#

正如您现在评论的“我有一个Pandas DF,其中一些状态值丢失,但可用于DF中其他行的同一城市”,那么您可以在City上使用groupby,并从同一城市的其他行条目中获取状态。你可以使用下面的代码。ffill和bfill替换正确State值之前或之后的任何NaN值。

import pandas as pd

data = {
    'city': ['Delhi', 'Mumbai', 'Bangalore', 'Hyderabad', 'Chennai', 'Delhi', 'Chennai'],
    'state': ['Delhi', 'Maharashtra', 'Karnataka', 'Telangana', None, None, 'Tamil Nadu'],
}

df = pd.DataFrame(data)

df['state'] = df.groupby(['city'])['state'].transform(lambda x: x.ffill().bfill())

print(df)

给出:

city        state
0      Delhi        Delhi
1     Mumbai  Maharashtra
2  Bangalore    Karnataka
3  Hyderabad    Telangana
4    Chennai   Tamil Nadu
5      Delhi        Delhi
6    Chennai   Tamil Nadu
5cnsuln7

5cnsuln72#

示例

请提供代码不图像和提供所需的输出

import numpy as np
import pandas as pd

data1 = {'city': ['Delhi', 'Calcutta', 'Delhi', 'Chennai', 'Bokaro', 'Visakhapatnam', 'Chennai', 'Wanparti', 'Delhi', 'Mumbai'], 
         'state': ['Delhi', 'West Bengal', 'Delhi', 'TamilNadu', 'Jharkhand', 'AndhraPradesh', 'TamilNadu', 'AndhraPradesh', 'Delhi', 'Maharashtra']}
df1 = pd.DataFrame(data1)

data2 = {'city': ['Pune', 'Visakhapatnam', 'Indore', 'Visakhapatnam', 'Chennai', 'Chennai', 'Indore', 'Chennai', 'Delhi', 'Pune']}
df2 = pd.DataFrame(data2)
df2['state'] = np.nan

DF1

city            state
0   Delhi           Delhi
1   Calcutta        West Bengal
2   Delhi           Delhi
3   Chennai         TamilNadu
4   Bokaro          Jharkhand
5   Visakhapatnam   AndhraPradesh
6   Chennai         TamilNadu
7   Wanparti        AndhraPradesh
8   Delhi           Delhi
9   Mumbai          Maharashtra

DF2

city            state
0   Pune            NaN
1   Visakhapatnam   NaN
2   Indore          NaN
3   Visakhapatnam   NaN
4   Chennai         NaN
5   Chennai         NaN
6   Indore          NaN
7   Chennai         NaN
8   Delhi           NaN
9   Pune            NaN

编码

m = dict(df1.values)
df2.assign(state=df2['state'].fillna(df2['city'].map(m)))

输出:

city            state
0   Pune            NaN
1   Visakhapatnam   AndhraPradesh
2   Indore          NaN
3   Visakhapatnam   AndhraPradesh
4   Chennai         TamilNadu
5   Chennai         TamilNadu
6   Indore          NaN
7   Chennai         TamilNadu
8   Delhi           Delhi
9   Pune            NaN
o0lyfsai

o0lyfsai3#

我相信你需要一本字典,把每个城市与它的州Map在一起,那么这将是小菜一碟。
对于印度,this link为印度所有城市和州提供JSON文件格式。
下面是一个示例代码:

data = {
    'city': ['Delhi', 'Mumbai', 'Bangalore', 'Hyderabad', 'Chennai'],
    'state': ['Delhi', 'Maharashtra', 'Karnataka', 'Telangana', 'Tamil Nadu'],
}

city_state_dict = {
    'Delhi': 'Delhi',
    'Mumbai': 'Maharashtra',
    'Bangalore': 'Karnataka',
    'Hyderabad': 'Telangana',
    'Chennai': 'Tamil Nadu',
    'Kolkata': 'West Bengal',
    'Pune': 'Maharashtra',
}

# This line is to simulate the Nan valu in state column
added_row = pd.Series(['Kolkata', np.nan], index=['city', 'state']).to_frame().T
added_row_2 = pd.Series(['Kolkata', 'West Bengal'], index=['city', 'state']).to_frame().T
added_row_3 = pd.Series(['Pune', np.nan], index=['city', 'state']).to_frame().T
final = (
    pd.concat(
        [
            pd.DataFrame(data),
               added_row, added_row_2, added_row_3],
               axis=0,
               ignore_index=True)
    .assign(state=lambda df: df.city.map(city_state_dict))
)
final.head(10)

如果你想要一个不能覆盖所有情况的快速修复,你可以使用正向填充和反向填充,例如:

final = (
    pd.concat(
        [
            pd.DataFrame(tt),
               added_row,
               added_row_2,
               added_row_3],
               axis=0,
               ignore_index=True)
    # .assign(state=lambda df: df.city.map(city_state_dict))
    .assign(state= lambda df_: df_.groupby('city', group_key=False).state.apply(lambda x: x.bfill().ffill()))
)
final.head(10)

这将给予以下输出,如果有一个城市在您的 Dataframe 中没有相应的州,但您想要填充它,则它将是一个带有bfill()ffill()的NaN:

为什么会这样?因为我们按***城市***分组,浦那城市在该组中只有一行,没有关于国家的向后或向前知识来归咎它。
我希望这对你有帮助!

相关问题