Python 重新排列熊猫中的数据帧 下面是我的数据框: 总班次 MS:早班 ES:夜班 11,22,33是员工id

Python 重新排列熊猫中的数据帧 下面是我的数据框: 总班次 MS:早班 ES:夜班 11,22,33是员工id,python,python-2.7,pandas,dataframe,Python,Python 2.7,Pandas,Dataframe,数据帧: Day Date GS MS ES 0 Monday 20/02/2017 11 22 33 1 Tuesday 21/02/2017 22 11 33 2 Wednesday 22/02/2017 33 22 11 我想把那个数据帧转换成下面的模式 20/02/2017 21/02/2017 22/02/2017 Monday Tuesday W

数据帧:

         Day        Date  GS  MS  ES
0     Monday  20/02/2017  11  22  33
1    Tuesday  21/02/2017  22  11  33
2  Wednesday  22/02/2017  33  22  11
我想把那个数据帧转换成下面的模式

         20/02/2017  21/02/2017  22/02/2017
          Monday       Tuesday    Wednesday
0     11    GS           MS         ES
1     22    ES           GS         MS
2     33    MS           ES         GS

因此,我尝试根据员工id转换表,我尝试了
数据框.transpose()
,但我无法让它完成我需要的工作。

您可以迭代数据框并基于当前数据创建新的数据框,只需将两列合并在一起:

data = []
for row in df.itertuples():
    data.append([
        # row[2]: Day, row[1]: Date
        '{} {}'.format(row[2],row[1]), 
        *row[3:],
    ])

new_df = pd.DataFrame(data)

您可以迭代dataframe并基于当前数据创建新的dataframe,只需将两列合并在一起:

data = []
for row in df.itertuples():
    data.append([
        # row[2]: Day, row[1]: Date
        '{} {}'.format(row[2],row[1]), 
        *row[3:],
    ])

new_df = pd.DataFrame(data)
您可以使用:

另一个解决方案包括和:

但如果得到:

ValueError:索引包含重复的条目,无法重塑

具有和的解决方案:

您可以使用:

另一个解决方案包括和:

但如果得到:

ValueError:索引包含重复的条目,无法重塑

具有和的解决方案:


如果您熔化并旋转,则可以获得:

代码:

def by_employee(frame):
    melted = pd.melt(
        frame, value_vars=['GS', 'MS', 'ES'], id_vars=['Day', 'Date'])
    pivot = pd.pivot_table(melted, values='variable', index='value',
                           columns=['Day', 'Date'],
                           aggfunc=lambda x: x.values[0])
    return pivot
data = [x.strip().split() for x in """
            Day        Date  GS  MS  ES
         Monday  20/02/2017  11  22  33
        Tuesday  21/02/2017  22  11  33
      Wednesday  22/02/2017  33  22  11
""".split('\n')[1:-1]]
df = pd.DataFrame(data[1:], columns=data[0])
print(df)

print(by_employee(df))
         Day        Date  GS  MS  ES
0     Monday  20/02/2017  11  22  33
1    Tuesday  21/02/2017  22  11  33
2  Wednesday  22/02/2017  33  22  11

Day       Monday    Tuesday  Wednesday
Date  20/02/2017 21/02/2017 22/02/2017
value                                 
11            GS         MS         ES
22            MS         GS         MS
33            ES         ES         GS
测试代码:

def by_employee(frame):
    melted = pd.melt(
        frame, value_vars=['GS', 'MS', 'ES'], id_vars=['Day', 'Date'])
    pivot = pd.pivot_table(melted, values='variable', index='value',
                           columns=['Day', 'Date'],
                           aggfunc=lambda x: x.values[0])
    return pivot
data = [x.strip().split() for x in """
            Day        Date  GS  MS  ES
         Monday  20/02/2017  11  22  33
        Tuesday  21/02/2017  22  11  33
      Wednesday  22/02/2017  33  22  11
""".split('\n')[1:-1]]
df = pd.DataFrame(data[1:], columns=data[0])
print(df)

print(by_employee(df))
         Day        Date  GS  MS  ES
0     Monday  20/02/2017  11  22  33
1    Tuesday  21/02/2017  22  11  33
2  Wednesday  22/02/2017  33  22  11

Day       Monday    Tuesday  Wednesday
Date  20/02/2017 21/02/2017 22/02/2017
value                                 
11            GS         MS         ES
22            MS         GS         MS
33            ES         ES         GS
结果:

def by_employee(frame):
    melted = pd.melt(
        frame, value_vars=['GS', 'MS', 'ES'], id_vars=['Day', 'Date'])
    pivot = pd.pivot_table(melted, values='variable', index='value',
                           columns=['Day', 'Date'],
                           aggfunc=lambda x: x.values[0])
    return pivot
data = [x.strip().split() for x in """
            Day        Date  GS  MS  ES
         Monday  20/02/2017  11  22  33
        Tuesday  21/02/2017  22  11  33
      Wednesday  22/02/2017  33  22  11
""".split('\n')[1:-1]]
df = pd.DataFrame(data[1:], columns=data[0])
print(df)

print(by_employee(df))
         Day        Date  GS  MS  ES
0     Monday  20/02/2017  11  22  33
1    Tuesday  21/02/2017  22  11  33
2  Wednesday  22/02/2017  33  22  11

Day       Monday    Tuesday  Wednesday
Date  20/02/2017 21/02/2017 22/02/2017
value                                 
11            GS         MS         ES
22            MS         GS         MS
33            ES         ES         GS

如果您熔化并旋转,则可以获得:

代码:

def by_employee(frame):
    melted = pd.melt(
        frame, value_vars=['GS', 'MS', 'ES'], id_vars=['Day', 'Date'])
    pivot = pd.pivot_table(melted, values='variable', index='value',
                           columns=['Day', 'Date'],
                           aggfunc=lambda x: x.values[0])
    return pivot
data = [x.strip().split() for x in """
            Day        Date  GS  MS  ES
         Monday  20/02/2017  11  22  33
        Tuesday  21/02/2017  22  11  33
      Wednesday  22/02/2017  33  22  11
""".split('\n')[1:-1]]
df = pd.DataFrame(data[1:], columns=data[0])
print(df)

print(by_employee(df))
         Day        Date  GS  MS  ES
0     Monday  20/02/2017  11  22  33
1    Tuesday  21/02/2017  22  11  33
2  Wednesday  22/02/2017  33  22  11

Day       Monday    Tuesday  Wednesday
Date  20/02/2017 21/02/2017 22/02/2017
value                                 
11            GS         MS         ES
22            MS         GS         MS
33            ES         ES         GS
测试代码:

def by_employee(frame):
    melted = pd.melt(
        frame, value_vars=['GS', 'MS', 'ES'], id_vars=['Day', 'Date'])
    pivot = pd.pivot_table(melted, values='variable', index='value',
                           columns=['Day', 'Date'],
                           aggfunc=lambda x: x.values[0])
    return pivot
data = [x.strip().split() for x in """
            Day        Date  GS  MS  ES
         Monday  20/02/2017  11  22  33
        Tuesday  21/02/2017  22  11  33
      Wednesday  22/02/2017  33  22  11
""".split('\n')[1:-1]]
df = pd.DataFrame(data[1:], columns=data[0])
print(df)

print(by_employee(df))
         Day        Date  GS  MS  ES
0     Monday  20/02/2017  11  22  33
1    Tuesday  21/02/2017  22  11  33
2  Wednesday  22/02/2017  33  22  11

Day       Monday    Tuesday  Wednesday
Date  20/02/2017 21/02/2017 22/02/2017
value                                 
11            GS         MS         ES
22            MS         GS         MS
33            ES         ES         GS
结果:

def by_employee(frame):
    melted = pd.melt(
        frame, value_vars=['GS', 'MS', 'ES'], id_vars=['Day', 'Date'])
    pivot = pd.pivot_table(melted, values='variable', index='value',
                           columns=['Day', 'Date'],
                           aggfunc=lambda x: x.values[0])
    return pivot
data = [x.strip().split() for x in """
            Day        Date  GS  MS  ES
         Monday  20/02/2017  11  22  33
        Tuesday  21/02/2017  22  11  33
      Wednesday  22/02/2017  33  22  11
""".split('\n')[1:-1]]
df = pd.DataFrame(data[1:], columns=data[0])
print(df)

print(by_employee(df))
         Day        Date  GS  MS  ES
0     Monday  20/02/2017  11  22  33
1    Tuesday  21/02/2017  22  11  33
2  Wednesday  22/02/2017  33  22  11

Day       Monday    Tuesday  Wednesday
Date  20/02/2017 21/02/2017 22/02/2017
value                                 
11            GS         MS         ES
22            MS         GS         MS
33            ES         ES         GS

“{}{}”.format(第[2]行,第[1]行],*第[3]行:,->无效语法您使用的是哪个python版本?python的早期版本不允许解压列表,因此您需要自己解压:data=[]对于df.itertuples()中的行:data.append([{}}}.format(第[2]行,第[1]行],[第2]行]:Day,第[1]行]:Date行[3],第[4],第[5]行])new_df=pd.DataFrame(数据)好的,谢谢,我会工作并更新状态。我使用的是python 2.7'{}{}'。格式(第[2]行,第[1]行],*第[3]行:,->无效语法您使用的是哪种python版本?早期版本的python不允许解压列表,所以您需要自己解压:数据=[]对于df.itertuples()中的行:data.append([{}{}}.format(第[2]行,第[1]行],#第[2]行]:天,第[1]行]:日期行[3],第[4]行],第[5]]行)新建_df=pd.DataFrame(数据)好的,谢谢,我将工作并更新状态。我正在使用python 2.7