【问题标题】:Pandas Dataframe to Dataframe Assignment Not Aligning and Producing NaNPandas Dataframe 到 Dataframe 分配不对齐并产生 NaN
【发布时间】:2018-12-20 16:25:56
【问题描述】:

我正在尝试将一个 Pandas 数据帧的值分配给另一个数据帧。但是,作业结果没有按我预期的那样表现,我不知道为什么。我有一个解决方法,但是,我不明白为什么这个解决方法是必要的,或者它是否是首选的解决方法。

我这样设置我的数据:

d1 = {'col1': [1,2,3,4,5], 'col2': ['a','ERROR','ERROR','ERROR', 'e']}
df1 = pd.DataFrame(data=d1)
d2 = {'col3': ['b','c','d']}
df2 = pd.DataFrame(data=d2)
bad = (df1['col2'] == 'ERROR') 

这是我尝试过的(但它没有按我的预期工作):

df1.loc[bad,'col2'] = df2.loc[:,'col3']
print(df1)

   col1 col2
0     1    a
1     2    c
2     3    d
3     4  NaN
4     5    e

但是,如果我将代码更改为以下内容,那么它确实可以工作:

df1.loc[bad,'col2'] = df2.loc[:,'col3'].values
print(df1)

   col1 col2
0     1    a
1     2    b
2     3    c
3     4    d
4     5    e

【问题讨论】:

  • 因为df2.loc[:,'col3']的索引为[0, 1, 2],赋值会根据这些位置对齐到df1。
  • @coldspeed,我的解决方法是首选解决方法还是有更好的方法来解决问题?
  • 不,我认为这是最轻松的方式。要么,要么分配一个列表df2.loc[:,'col3'].tolist()

标签: python pandas


【解决方案1】:

解释@coldspeed 评论。

试试这个:

df1.loc[bad, 'col2'] 

给你

1    ERROR
2    ERROR
3    ERROR
Name: col2, dtype: object

如您所见,上面的数据有索引 1,2 和 3。现在检查 df2 索引

    col3
0   b
1   c
2   d

因此,当您使用 df1.loc[bad,'col2'] = df2.loc[:,'col3'] 替换时,只有第二个和第三个索引会获取值。但是,当您使用values 时,您会正确处理,因为这会形成一个 numpy 数组,可以从type(df2.col3.values) 或使用type(df2.col3.tolist()) 的python 列表验证。两者都可以接受。

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 2021-04-12
    • 2021-09-02
    • 2018-10-15
    • 2018-11-14
    • 2018-01-14
    • 2021-11-14
    • 2019-09-07
    • 2022-01-15
    相关资源
    最近更新 更多