首页 > 解决方案 > 通过在数据框 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设置为索引 来切片数据,因为还有其他数据帧(转置的数据需要从字符串中切片的列不在第一个位置。

标签: pythonpandasdataframe

解决方案


检查是否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

推荐阅读