用非常规方法有条件地填充数据帧中的缺失值

2024-04-25 14:20:30 发布

您现在位置:Python中文网/ 问答频道 /正文

TLDR;如何改进代码并使其更具pythonic?

你好

我们在教程中遇到的一个有趣的挑战是: “数据框中缺少X个条目,其中包含相关代码,但代码旁边有一个‘空白’条目。这是数据帧中的随机现象。利用您对熊猫的了解,将每个缺失的‘空白’条目映射到相关代码。”

这看起来像是:

|code| |name|
001     Australia
002     London
...
001    <blank>

我采用的方法如下:

循环遍历整个数据帧并用空格“”标识区域。通过将相关的正确代码(顺序)复制到数据帧来替换所有空格。你知道吗

code_names = [ "",
    'Economic management', 
    'Public sector governance', 
    'Rule of law',
    'Financial and private sector development', 
    'Trade and integration', 
    'Social protection and risk management', 
    'Social dev/gender/inclusion', 
    'Human development', 
    'Urban development', 
    'Rural development', 
    'Environment and natural resources management'
]

df_copy = df_.copy()

# Looks through each code name, and if it is empty, stores the proper name in its place
for x in range(len(df_copy.mjtheme_namecode)):
    for y in range(len(df_copy.mjtheme_namecode[x])):
        if(df_copy.mjtheme_namecode[x][y]['name'] == ""):
            df_copy.mjtheme_namecode[x][y]['name'] = code_names[int(df_copy.mjtheme_namecode[x][y]['code'])]

limit = 25
counter = 0

for x in range(len(df_copy.mjtheme_namecode)):
    for y in range(len(df_copy.mjtheme_namecode[x])):
        print(df_copy.mjtheme_namecode[x][y])
        counter += 1
    if(counter >= limit):
        break

虽然上述方法是有效的-有没有更好的,更python的方式来实现我的追求?我觉得我使用的方法非常笨拙,因为我的技能没有得到很好的发展。你知道吗

谢谢你!你知道吗


Tags: and数据代码nameindfforlen
1条回答
网友
1楼 · 发布于 2024-04-25 14:20:30

方法1:

一种方法是用NaN替换所有""空格,按codename对数据帧排序,然后使用^{}

从这个开始:

>>> df
   code       name
0     1  Australia
1     2     London
2     1           

您可以应用以下内容:

new_df = (df.replace({'name':{'':np.nan}})
          .sort_values(['code', 'name'])
          .fillna(method='ffill')
          .sort_index())

>>> new_df
   code       name
0     1  Australia
1     2     London
2     1  Australia

方法2:

这更复杂,但也会起作用: 使用groupbyfirstsqeeze,可以创建pd.Series将代码映射到非空名称,并使用.map将序列映射到code列:

df['name'] = (df['code']
              .map(
                  df.replace({'name':{'':np.nan}})
                  .sort_values(['code', 'name'])
                  .groupby('code')
                  .first()
                  .squeeze()
              ))

>>> df
   code       name
0     1  Australia
1     2     London
2     1  Australia

解释:这样创建的pd.Series映射如下所示:

code
1    Australia
2       London

它之所以有效是因为它获得了每个代码的第一个实例(通过groupby),排序方式使得NaN是最后一个。因此,只要每个代码都与一个名称相关联,这个方法就可以工作。你知道吗

相关问题 更多 >

    热门问题