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列。 任何帮助肯定会受到赞赏。
答案 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