Python 将列从一个数据帧复制到另一个数据帧会给出NaN值吗?

Python 将列从一个数据帧复制到另一个数据帧会给出NaN值吗?,python,pandas,types,copy,Python,Pandas,Types,Copy,这已经被问了很多次了,似乎对其他人有效,但是,当我从不同的数据帧复制列时,我得到了NaN值(df1和df2的长度相同) 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

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

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
       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

      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
       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
我得到以下信息

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
为什么会这样?还有一个讨论了
合并
,但我只需要复制它。任何帮助都将不胜感激

罪魁祸首是不一致的索引 您的数据帧的索引不同(相应地,每列的索引也不同),因此当尝试将一个数据帧的一列分配给另一个数据帧时,熊猫将尝试对齐索引,如果不对齐,则插入NaN。

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

# Setup
A = pd.DataFrame(index=['a', 'b', 'c']) 
B = pd.DataFrame(index=['b', 'c', 'd', 'f'])                                  
C = pd.DataFrame(index=[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\u index()


解决方案2:分配NumPy数组(绕过索引对齐) 只有当两个数据帧的长度匹配时,此解决方案才会起作用

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

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

@i、 n.n.m可能是索引的问题。尝试添加
ignore\u index=True
?否则,请先重置两个索引,然后连接。@i.n.n.m try
df2['date']=df1['date']。值
@i.n.n.m我猜到了。索引不相同。我有两个数据帧,其中一个有范围索引,另一个有整数索引,变量在该范围内。看看数据帧,索引看起来不错,但交叉点是空的。因此,我不得不改为使用_numpy()。