Yma*_*eth 6 python python-3.x pandas
当两个数据帧连接在一起时(使用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
Run Code Online (Sandbox Code Playgroud)
但如果其中一个数据帧中缺少的列包含时间戳,则会中断...
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)
Run Code Online (Sandbox Code Playgroud)
抛出"AttributeError:'NoneType'对象没有属性'_can_consolidate'".
Python 3.6.5; 熊猫0.23; Windows 7 x64
这是已知的问题吗?
他们是否知道任何变通方法?
正如评论中所解释的,这是一个已知问题(请参阅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
Run Code Online (Sandbox Code Playgroud)
另一种,正如@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |