gpt4 book ai didi

python - 将一列从一个 DataFrame 复制到另一个会给出 NaN 值?

转载 作者:IT老高 更新时间:2023-10-28 20:51:56 25 4
gpt4 key购买 nike

这个 question 已被问过很多次,它似乎对其他人有用,但是,当我从不同的 DataFrame(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

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

最佳答案

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

您的 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()

关于python - 将一列从一个 DataFrame 复制到另一个会给出 NaN 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com