python - 通过在数据框 python pandas 的转置上从另一列切片字符串的新列
问题描述
我正在尝试从一列中分割一个子字符串并将其放入另一列。我已经阅读了多个链接,但存在这个问题,因为我将处理的数据框是转置。(这是一个最小的可重现示例,原始数据框很大,我只能处理转置的数据)。
df (How to generate df for this question, sample df,minimum reproducible eg.)
[IN]
import pandas as pd
df = pd.DataFrame({'SKU': ['BIKES','MATS', 'BLANKETS', 'CREAMS'],
'JAN15 SVAL': [1,3,6,10],
'FEB15 SVAL': [4,5, 6,16],
'MAR15 SVAL':[13, 14,10,12]})
dft1 = df.set_index('SKU').T
其他信息:
[IN]dft1.columns
[OUT]Index(['BIKES', 'MATS', 'BLANKETS', 'CREAMS'], dtype='object', name='SKU')
[IN]print(dft1.index.name)
[OUT]None
dft1 的预期输出:
SKU BIKES MATS BLANKETS CREAMS month year month_number Date
JAN15 SVAL 1 3 6 10 JAN 2015 1 2015-01-01
FEB15 SVAL 4 5 6 16 FEB 2015 2 2015-02-01
MAR15 SVAL 13 14 10 12 MAR 2015 3 2015-03-01
到目前为止尝试的代码不起作用并给出[OUT]中提到的错误
[IN]dft1['month'] = dft1['SKU'].apply(lambda x: x[:3])
[IN]dft1['year']=2000 + dft1['SKU'].str[3:5].astype(int)
[IN]cmap = {'JAN': 1, 'FEB': 2, 'MAR': 3, 'APR': 4, 'MAY': 5, 'JUN': 6,'JUL':7, 'AUG':8,'SEP':9,'OCT':10,'NOV':11,'DEC':12}
[IN]dft1['Month Number']=dft1['month'].map(cmap)
[IN]dft1['Month Number']=dft1['Month Number'].round(0)
[IN]dft1['Date']=(pd.to_datetime(dft1['year'].astype(str) + dft1['month'], format='%Y%b'))
[OUT]KeyError: 'SKU'
PS我不想将第一列SKU设置为索引 来切片数据,因为还有其他数据帧(转置的数据需要从字符串中切片的列不在第一个位置。
解决方案
检查是否SKU
为索引,如果是则重置索引并重命名列,否则继续。
import pandas as pd
df = pd.DataFrame({'SKU': ['BIKES','MATS', 'BLANKETS', 'CREAMS'],
'JAN15 SVAL': [1,3,6,10],
'FEB15 SVAL': [4,5, 6,16],
'MAR15 SVAL':[13, 14,10,12]})
dft1 = df.set_index('SKU').T
if dft1.columns.name == 'SKU':
dft1 = dft1.reset_index()
dft1.rename(columns={'index':'SKU'}, inplace=True)
cmap = {'JAN': 1, 'FEB': 2, 'MAR': 3, 'APR': 4, 'MAY': 5, 'JUN': 6,'JUL':7, 'AUG':8,'SEP':9,'OCT':10,'NOV':11,'DEC':12}
dft1['month'] = dft1.index.str[0:3]
dft1['year'] = 2000 + (dft1.index.astype(str).str[3:5]).astype(int)
dft1['Month Number'] = dft1['month'].map(cmap)
dft1['Date'] = (pd.to_datetime(dft1['year'].astype(str) + dft1['month'], format='%Y%b'))
输出:
SKU BIKES MATS BLANKETS CREAMS month year Month Number Date
JAN15 SVAL 1 3 6 10 JAN 2015 1 2015-01-01
FEB15 SVAL 4 5 6 16 FEB 2015 2 2015-02-01
MAR15 SVAL 13 14 10 12 MAR 2015 3 2015-03-01
推荐阅读
- ios - iPhone 应用程序在更新后以 iPhone 4 大小运行,带有黑条
- selenium - Geb、Spock、Gradle 和 maxParallelForks
- python - 如何将 python 根设置为 Dockerfile 工作目录
- python - 访问 runtest 挂钩内的 pytest PluginManager 对象
- java - 在java中将对象添加到动态列表中
- javascript - 在 Angular ngAfterViewInit 中返回未定义的索引处的数组
- android - 如何检测 TalkBack 是否处于活动状态?使用 Xamarin Forms -Dependency 服务
- python - 从音频信号中提取特征
- python - 如何重构检查条件的临时变量?
- ms-access - Application.forms.Count 有时不准确