【问题标题】:Copying a column from one DataFrame to another gives NaN values?将一列从一个 DataFrame 复制到另一个会给出 NaN 值?
【发布时间】:2018-01-26 14:31:52
【问题描述】:

这个question 已被问过很多次,它似乎对其他人有用,但是,当我从不同的DataFrame 复制列时,我得到NaN 值(df1df2 相同长度)。

df1

        date     hour      var1
a   2017-05-01  00:00:00   456585
b   2017-05-01  01:00:00   899875
c   2017-05-01  02:00:00   569566
d   2017-05-01  03:00:00   458756
e   2017-05-01  04:00:00   231458
f   2017-05-01  05:00:00   986545

df2

      MyVar1     MyVar2 
 0  6169.719338 3688.045368
 1  5861.148007 3152.238704
 2  5797.053347 2700.469871
 3  5779.102340 2730.471948
 4  6708.219647 3181.298291
 5  8550.380343 3793.580394

我的df2需要这样的

       MyVar1    MyVar2        date        hour
 0  6169.719338 3688.045368  2017-05-01  00:00:00
 1  5861.148007 3152.238704  2017-05-01  01:00:00
 2  5797.053347 2700.469871  2017-05-01  02:00:00
 3  5779.102340 2730.471948  2017-05-01  03:00:00
 4  6708.219647 3181.298291  2017-05-01  04:00:00
 5  8550.380343 3793.580394  2017-05-01  05:00:00

我尝试了以下,

df2['date'] = df1['date']
df2['hour'] = df1['hour']

type(df1)
>> pandas.core.frame.DataFrame

type(df2)
>> pandas.core.frame.DataFrame

我得到以下,

       MyVar1    MyVar2      date       hour
 0  6169.719338 3688.045368  NaN        NaN
 1  5861.148007 3152.238704  NaN        NaN
 2  5797.053347 2700.469871  NaN        NaN

为什么会这样?还有另一个post 讨论merge,但我只需要复制它。任何帮助,将不胜感激。

【问题讨论】:

    标签: python pandas types copy


    【解决方案1】:

    罪魁祸首是无法对齐的索引

    您的 DataFrame 的索引不同(相应地,每列的索引也不同),因此当尝试将一个 DataFrame 的列分配给另一个时,pandas 将尝试对齐索引,如果不这样做,请插入 NaN。

    考虑以下示例以了解这意味着什么:

    # Setup
    A = pd.DataFrame(index=['a', 'b', 'c']) 
    B = pd.DataFrame(index=['b', 'c', 'd', 'f'])                                  
    C = pd.DataFrame(index=[1, 2, 3])
    
    # Example of alignable indexes - A & B (complete or partial overlap of indexes)
    A.index B.index
          a        
          b       b   (overlap)
          c       c   (overlap)
                  d
                  f
    
    # Example of unalignable indexes - A & C (no overlap at all)
    A.index C.index
          a        
          b        
          c        
                  1
                  2
                  3
    

    当没有重叠时,pandas 甚至无法匹配两个 DataFrame 之间的单个值来放入赋值结果,因此输出是一列充满 NaN。

    如果您正在使用 IPython 笔记本,您可以检查这确实是使用的根本原因,

    df1.index.equals(df2.index)
    # False
    df1.index.intersection(df2.index).empty
    # True
    

    您可以使用以下任一解决方案来解决此问题。

    解决方案 1:重置两个 DataFrame 的索引

    如果您一开始并不打算使用不同的索引,或者您不特别关心保留索引,则您可能更喜欢此选项。

    # Optional, if you want a RangeIndex => [0, 1, 2, ...]
    # df1.index = pd.RangeIndex(len(df))
    # Homogenize the index values,
    df2.index = df1.index
    # Assign the columns.
    df2[['date', 'hour']] = df1[['date', 'hour']]
    

    如果你想保留现有的索引,但是作为一个列,你可以使用reset_index()来代替。


    解决方案 2:分配 NumPy 数组(绕过索引对齐)

    此解决方案仅在两个 DataFrame 的长度匹配时才有效。

    # pandas >= 0.24
    df2['date'] = df1['date'].to_numpy()
    # pandas < 0.24
    df2['date'] = df1['date'].values
    

    要轻松分配多列,请使用,

    df2[['date', 'hour']] = df1[['date', 'hour']].to_numpy()
    

    【讨论】:

    • @i.n.n.m 可能是您的索引有问题。试试添加ignore_index=True?否则,请先重置两个索引,然后再连接。
    • @i.n.n.m 试试df2['date'] = df1['date'].values
    • @i.n.n.m 啊,我猜对了。指标不相同
    • 我有两个数据框,其中一个具有范围索引,另一个具有整数索引,并且值在该范围内。查看数据框,索引看起来不错,但交叉点是空的。所以我不得不改用 to_numpy()。
    【解决方案2】:

    试试这个?

    df2['date'] = df1['date'].values
    df2['hour'] = df1['hour'].values
    

    【讨论】:

    • 这比公认的解决方案要好!
    • 数据很大的时候(大概10^5),那么慢,到底有没有?
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多