【问题标题】:Unexpected assignment in dataframe columns数据框列中的意外分配
【发布时间】:2021-07-13 16:23:42
【问题描述】:

我正在使用 pandas 数据框模拟数据,代码如下:

import pandas as pd
from random import randrange

df = pd.DataFrame()
df['YYYYMM'] = pd.Series(3*list(pd.date_range(start="1/1/2019", end="12/1/2020", freq="MS")))
df['Regions'] = pd.Series(['NA', 'EMEA', 'APAC']).repeat(24).reset_index()[0]

df_emea = df[df['Regions'] == 'EMEA'].copy()
df_emea["YYYYMM"] = df_emea["YYYYMM"].repeat(3).reset_index()['YYYYMM']
df_emea["country"] = pd.Series(24*['UK', 'Germany', 'France']).reset_index()[0]

df_na = df[df['Regions'] == 'NA'].copy()
df_na["YYYYMM"] = df_na["YYYYMM"].repeat(2).reset_index()['YYYYMM']
df_na["Country"] = pd.Series(24*['Canada', 'USA']).reset_index()[0]

df_apac = df[df['Regions'] == 'APAC'].copy()
df_apac["YYYYMM"] = df_apac["YYYYMM"].repeat(2).reset_index()['YYYYMM']
df_apac["Country"] = pd.Series(24*['China', 'Japan']).reset_index()[0]

除了df_apac,一切正常。不知何故,我在Country 列中有None,在YYYYMM 列中有NaT:

有人可以解释为什么会这样吗?

【问题讨论】:

  • 从您的第四行代码中删除 freq="MS" 参数。
  • @etch_45,感谢您的评论,我为什么要删除它?它代表月份开始。
  • 有趣。这看起来像一个类似于 one 不久前的错误,它还涉及 df.reset_index 和数据损坏。

标签: python pandas dataframe


【解决方案1】:

您遇到了索引问题。由于您不重置初始 df_xxx 数据帧的索引,因此它们会保留初始数据帧中的索引。因此,当您稍后尝试添加新列时,索引未对齐。

所以快速解决方法是使用:

df_emea = df[df['Regions'] == 'EMEA'].copy().reset_index(drop=True)
...
df_na = df[df['Regions'] == 'NA'].copy().reset_index(drop=True)
...
df_apac = df[df['Regions'] == 'APAC'].copy().reset_index(drop=True)
...

我现在给出了df_apac 的预期结果,但您仍然被 df_emea 的 48 行困住,而您需要 72 行才能接受 3 个国家/地区。但它可能满足您的要求...

【讨论】:

  • 谢谢,这对我有帮助。
猜你喜欢
  • 2015-12-07
  • 2018-09-02
  • 1970-01-01
  • 2011-12-06
  • 2014-02-07
  • 1970-01-01
  • 2020-05-23
  • 2023-03-11
相关资源
最近更新 更多