python - 通过切片重命名熊猫列,导致合并失败
问题描述
我有两个代表相似数据的数据框,但我想在更改 col 名称后合并。有几种方法可以实现这一点,但考虑到我实际数据框的大小,我想使用以下方法。我正在返回第二个 df 的 nan 值。
import pandas as pd
df1 = pd.DataFrame({
'time': ['2012-08-02 09:50:20.0','2012-08-02 09:50:32.5','2012-08-02 09:50:34.8'],
'Val': ['1,2,3','1,2,3','1,2,3'],
'Val2': [1,2,3],
'Val3': [1.1,2.1,3.1]
})
df2 = pd.DataFrame({
'time': ['2012-08-02 09:50:20.0','2012-08-02 09:50:32.5','2012-08-02 09:50:34.8'],
'Val': ['1,2,3','1,2,3','1,2,3'],
'Val2': [1,2,3],
'Val3': [1.1,2.1,3.1]
})
df1['time'] = pd.to_datetime(df1['time'])
df2['time'] = pd.to_datetime(df2['time'])
df1.columns.values[1:4] = ['first_' + str(x) for x in df1.columns[1:4]]
df2.columns.values[1:4] = ['second_' + str(x) for x in df2.columns[1:4]]
df3 = pd.merge(df1, df2, on = 'time')
print(df3)
time first_Val first_Val2 first_Val3 second_Val second_Val2 second_Val3
0 2012-08-02 09:50:20.000 1,2,3 1 1.1 NaN NaN NaN
1 2012-08-02 09:50:32.500 1,2,3 2 2.1 NaN NaN NaN
2 2012-08-02 09:50:34.800 1,2,3 3 3.1 NaN NaN NaN
预期输出:
time first_Val first_Val2 first_Val3 second_Val second_Val2 second_Val3
0 2012-08-02 09:50:20.000 1,2,3 1 1.1 1,2,3 1 1.1
1 2012-08-02 09:50:32.500 1,2,3 2 2.1 1,2,3 2 2.1
2 2012-08-02 09:50:34.800 1,2,3 3 3.1 1,2,3 3 3.1
解决方案
- 问题是列名的切片分配。
df1.columns.values[1:4] = new values
- 在熊猫 1.1.1 和 1.1.2 中失败
- 适用于 1.0.1 和 1.0.5
'time'
设置为索引,然后在更改列表理解中的列名后重置。- 这表明,可以使用列表理解重命名列,但不能通过 slicing 重命名
df.columns
。
- 这表明,可以使用列表理解重命名列,但不能通过 slicing 重命名
.reset_index()
可以删除,保留'time'
为索引,在这种情况下,使用df.join
, 而不是pd.merge
.- 选项是将没有新名称的列设置为索引,或
.rename
用于特定列。
df1 = pd.DataFrame({
'time': ['2012-08-02 09:50:20.0','2012-08-02 09:50:32.5','2012-08-02 09:50:34.8'],
'first_Val': ['1,2,3','1,2,3','1,2,3'],
'first_Val2': [1,2,3],
'first_Val3': [1.1,2.1,3.1]
})
df1['time'] = pd.to_datetime(df1['time'])
df1.set_index('time', inplace=True)
df1.columns = ['first_' + str(x) for x in df1.columns]
df1.reset_index(inplace=True)
df2 = pd.DataFrame({
'time': ['2012-08-02 09:50:20.0','2012-08-02 09:50:32.5','2012-08-02 09:50:34.8'],
'Val': ['1,2,3','1,2,3','1,2,3'],
'Val2': [1,2,3],
'Val3': [1.1,2.1,3.1]
})
df2['time'] = pd.to_datetime(df2['time'])
df2.set_index('time', inplace=True)
df2.columns = ['second_' + str(x) for x in df2.columns]
df2.reset_index(inplace=True)
# merge
df3 = pd.merge(df1, df2, on = 'time', how='left')
time first_first_Val first_first_Val2 first_first_Val3 second_Val second_Val2 second_Val3
0 2012-08-02 09:50:20.000 1,2,3 1 1.1 1,2,3 1 1.1
1 2012-08-02 09:50:32.500 1,2,3 2 2.1 1,2,3 2 2.1
2 2012-08-02 09:50:34.800 1,2,3 3 3.1 1,2,3 3 3.1
推荐阅读
- python - 在python中可以在单个if条件下写在下面吗?
- microsoft-graph-api - AccessDenied 令牌中需要存在 scp 或角色声明
- symfony - 限制对 Doctrine 实体的访问的单一位置
- rest - 并行调用中的骆驼REST服务问题
- sql - 如何使用计数在 SQL Server 中对列执行行
- aws-step-functions - 从 Step Function Activity 批量获取任务的任何方式
- c# - Control.ValueChanged 触发时间偏移
- html - html / css:悬停div的每个单词时加下划线,不换行
- java - 无法从 JSON 中解析“日期”
- php - 对数组值求和并在php上捕获每个索引输出