繁体   English   中英

Python数据框-来自3列的数据值将映射到其他3列下

[英]Python dataframe - data values from 3 columns to be mapped under other 3 columns

Python专家,我需要一些帮助来理解如何重塑或旋转Pandas数据框的列。 以下是我要执行的操作,遇到一种情况,我有6列First_name1,middle_name1,last_name1,first_name2,middle_name2和last_name2。 我想将最后3列的值放在第1 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

我不知道该怎么做。 此操作后,我只需要存在1st 3列。 任何帮助将不胜感激。

rsplit用于MultiIndex ,然后通过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

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

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

这是一个典型的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM