pandas 将列从一个DataFrame转换到另一个DataFrame会给出NaN值?

rt4zxlrg  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(93)

我有两个具有相同行数的DataFrame-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


我想把df1datehour列中的数据合并到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']


但是我得到的结果是datehour列中的NaN值:

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


为什么会发生这种情况?如何简单地赋值,使df1的第一行中的数据显示在df2的第一行中,等等?

cnwbcb6i

cnwbcb6i1#

罪魁祸首是不可删除的索引

您的DataFrame的索引不同(相应地,每个列的索引也不同),因此当尝试将一个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 notebook,则可以使用以下命令检查这是否确实是根本原因,

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


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

解决方案一:分配底层NumPy数组(绕过pandas索引对齐)

只有当两个DataFrame的长度匹配(即具有相同的行数)时,此解决方案才有效。

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

# (In pandas < 0.24, do df2['date'] = df1['date'].values )


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

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

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

当两个 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()代替。

siv3szwd

siv3szwd2#

试试这个

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

字符串

djmepvbi

djmepvbi3#

我知道我迟到了这个线程,但这种格式已经为我工作得很好。

df2.insert(1, value=df1['Name'], column='Name')

字符串
你也可以在那个值集参数中对df1执行函数。希望这对你有帮助

相关问题