将一列从一个DataFrame复制到另一个提供NaN值?
这个问题已经被问了很多遍了,而且似乎对其他人也NaN
有用,但是,当我从不同的DataFrame复制列(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
我需要这样 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
-
罪魁祸首是无法对齐的索引
您的DataFrames的索引是不同的 (相应地,每列 的索引也不同 ),因此,当尝试将一个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
当没有重叠时,熊猫甚至无法匹配两个DataFrame之间的单个值以放入分配结果,因此输出是充满NaN的列。
如果您使用的是IPython笔记本,则可以使用以下命令检查这是否确实是根本原因,
df1.index.equals(df2.index) # False df1.index.intersection(df2.index).empty # True
您可以使用以下任何一种解决方案来解决此问题。
解决方案1:重置两个DataFrames的索引
如果您不打算一开始就拥有不同的索引,或者您不太在意保留索引,则可能更喜欢此选项。
# 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()