繁体   English   中英

Pandas 将新列添加到现有 DataFrame 时存储 NaN 值

[英]Pandas storing NaN value when adding new column to existing DataFrame

Reading.xls 文件包含自 2000 年以来的巴西人口估计,我从 2000.xls 文件开始填充一个名为main_df的 dataframe,起初看起来像

STATE    STATE_CODE    CITY       CITY_CODE      2000_POP
SP X Sao Paulo Y 10.000.000 ...

从 2001 年到 2020 年遍历 *.xls 文件后, main_df应该如下所示:

STATE    STATE_CODE    CITY       CITY_CODE      2000_POP     2001_POP  2002_POP   ...  2020_POP
SP       X             Sao Paulo  Y              10.000.000   m         n          ...  p
...

为了实现它,我以一种不太有效的方式使用 Pandas,遍历 df 行,但无论如何,这就是我发现寻找城市和 state 代码的人口规模的方式。

作为df代表 2001 ~ 2020 年城市人口估计的数据框。
下面是迭代每个df行试图填充main_df的代码片段:

df = pd.read_excel(filename, encoding='latin_1', sep=',')

column_year_id = filename.strip('.xls')
df.columns = ['STATE', 'STATE_CODE', 'CITY', 'CITY_CODE', column_year_id]

for index, row in df.iterrows():
    target_uf = (row['STATE_CODE'])
    target_city_code = (str(row['CITY_CODE']))
    population_on_current_year = row[-1]
                                                
    selection = (main_df['STATE_CODE'] == target_uf) & (main_df['CITY_CODE'] == target_city_code)
                   
    main_df.loc[selection, column_year_id] = population_on_current_year

问题是,在一天结束时, main_df最终只填充了其原始的 2000 人口规模列,但是,从 2001 年到 2020 年,它填充了 NaN 值,如下所示:

STATE    STATE_CODE    CITY       CITY_CODE      2000_POP     2001_POP  2002_POP   ...  2020_POP
SP       X             Sao Paulo  Y              10.000.000   NaN       NaN        ...  NaN
...

为什么会这样,我应该怎么做才能让它发挥作用?

问题似乎是因为我无法将元素插入到特定的 position 中,就像main_df是一个使用main_df[index, column]的数组一样。 Pandas 是否允许这种插入?

编辑 1:这就是我创建main_df的方式:

main_df = pd.read_excel(filename, encoding='latin_1', sep=',')

我能够做我想做的事:

selection = (main_df['COD_UF'] == target_state) & (main_df['COD_MUN'] == target_city)
index = main_df.loc[selection].index
main_df.loc[index.values[0], column_year_id] = population_on_current_year

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM