Python数据帧 - 要在其他3列下映射的3列数据值

时间:2017-10-26 13:54:24

标签: python pandas dataframe

Python专家,我需要一些帮助,了解如何重新塑造或转动我的pandas数据框的列。以下是我想要做的事情,我有一个情况,我有6列First_name1,middle_name1,last_name1,first_name2,middle_name2和last_name2。我想把最后3列的值带到前3列,就像某种旋转但不完全一样。

First Name 1    Middle Name 1   Last Name 1 First Name 2    Middle Name 2   Last Name 2
    ABC      DAF                 XYZ          LOU           NaN      XYZ

我无法理解如何做到这一点。此操作后我只需要存在前3列。 任何帮助肯定会受到赞赏。

3 个答案:

答案 0 :(得分:2)

MultiIndex使用rsplit,然后按stack重新整形reset_index

df.columns = df.columns.str.rsplit(n=1, expand=True)
print (df)
  First Name Middle Name Last Name First Name Middle Name Last Name
           1           1         1          2           2         2
0        ABC         DAF       XYZ        LOU         NaN       XYZ

df = df.stack().reset_index(drop=True)
print (df)
  First Name Last Name Middle Name
0        ABC       XYZ         DAF
1        LOU       XYZ         NaN

另一个未记录的函数lreshape的解决方案:

d = {'First Name':df.columns[df.columns.str.startswith('First Name')],
     'Middle Name':df.columns[df.columns.str.startswith('Middle Name')],
     'Last Name':df.columns[df.columns.str.startswith('Last Name')]}

df = pd.lreshape(df, d, dropna=False)
print (df)
  Middle Name First Name Last Name
0         DAF        ABC       XYZ
1         NaN        LOU       XYZ

答案 1 :(得分:1)

您可以使用数据框架构造器和值重塑,即

ndf = pd.DataFrame(df.values.reshape(-1,3),columns=['First Name','Middle Name','Last Name'])
 First Name Middle Name Last Name
0        ABC         DAF       XYZ
1        LOU         NaN       XYZ

样本在多行数据上运行,即

   First Name 1 Middle Name 1 Last Name 1 First Name 2  Middle Name 2 Last Name 2
0        ABC         DAF       XYZ        LOU          NaN       XYZ
0        ABC         DAF       XYZ        LOU          NaN       XYZ

输出:

 First Name Middle Name Last Name
0        ABC         DAF       XYZ
1        LOU         NaN       XYZ
2        ABC         DAF       XYZ
3        LOU         NaN       XYZ

答案 2 :(得分:1)

这是一个典型的pd.wide_to_long问题,一行代码如下:

pd.wide_to_long(df.reset_index(), ["FirstName", "MiddleName","LastName"], i="index", j="year").reset_index(drop=True)
Out[506]: 
  FirstName MiddleName LastName
0       ABC        DAF      XYZ
1       ABC        DAF      XYZ
2       LOU        NaN      XYZ
3       LOU        NaN      XYZ