将列从一个数据帧复制到另一个数据帧会产生NaN值?

2024-09-27 07:26:06 发布

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

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

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,但我只需要复制它。任何帮助都将不胜感激。


Tags: 数据coredataframepandasdatetypenanframe
2条回答

罪魁祸首是不可对齐的索引

数据帧的索引不同(相应地,每列的索引也不同),因此当尝试将一个数据帧的列分配给另一个数据帧时,熊猫将尝试对齐索引,如果不对齐,则插入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甚至无法匹配要放入赋值结果的两个数据帧之间的单个值,因此输出是一个充满nan的列。

如果你在做一个IPython笔记本,你可以用

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

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

解决方案1:重置两个数据帧的索引

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

# 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数组(绕过索引对齐)

只有当两个数据帧的长度匹配时,此解决方案才有效。

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

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

df2 = df2.assign(**{c: df1[c].to_numpy() for c in ('date', 'hour')})

试试这个?

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

相关问题 更多 >

    热门问题