默认情况下,将两个数据帧连接在一起(使用concat)时,concat会创建一个新的数据帧,并同时合并两个列的列,并使用nan设置结果中任何缺少的列的值。例如...
import pandas as pd
a = pd.DataFrame({'A':range(5), 'B':range(5)})
b = pd.DataFrame({'A':range(5)})
pd.concat([a , b], sort=False)
A B
0 0 0.0
1 1 1.0
...
3 3 NaN
4 4 NaN
但是,如果其中一个数据帧中缺少的列包含时间戳记,则会中断...
a = pd.DataFrame({'A':range(5), 'B':[pd.Timestamp.utcnow() for _ in range(5)]})
b = pd.DataFrame({'A':range(5)})
pd.concat([a , b], sort=False)
抛出“ AttributeError:'NoneType'对象没有属性'_can_consolidate'”。
Python 3.6.5;熊猫0.23; Windows 7 x64
这是已知问题吗?
他们知道有什么解决方法吗?
答案 0 :(得分:2)
如评论中所述,这是一个已知问题(请参见GH22796),并且在0.24版中已解决。同时,有两种可能的解决方法。
一种是转换为字符串:
df = pd.concat([a.assign(B=a.B.astype(str)), b], sort=False)
df['B'] = pd.to_datetime(df['B'], errors='coerce')
df
A B
0 0 2018-12-06 18:21:35.363477
1 1 2018-12-06 18:21:35.363728
2 2 2018-12-06 18:21:35.363740
3 3 2018-12-06 18:21:35.363748
4 4 2018-12-06 18:21:35.363756
0 0 NaT
1 1 NaT
2 2 NaT
3 3 NaT
4 4 NaT
另一个,如@root所述,是在b
中初始化一个空列:
pd.concat([a, b.assign(B=pd.NaT)], sort=False)
A B
0 0 2018-12-06 18:21:35.363477+00:00
1 1 2018-12-06 18:21:35.363728+00:00
2 2 2018-12-06 18:21:35.363740+00:00
3 3 2018-12-06 18:21:35.363748+00:00
4 4 2018-12-06 18:21:35.363756+00:00
0 0 NaT
1 1 NaT
2 2 NaT
3 3 NaT
4 4 NaT