基于一个列值合并多行,并基于其他列值添加额外的列

fruv7luv  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(323)

我有以下Dataframe:

Name   rollNumber   external_roll_number    testDate      marks 

0    John      34             234               2021-04-28      15 

1    John      34             234               2021-03-28      25

我想把它转换成这样:

Name   rollNumber   external_roll_number    testMonth      marks    testMonth      marks

0    John      34             234                  April          15       March         25

如果上述不可能,那么我至少希望它是这样的:

Name   rollNumber   external_roll_number    testDate      marks    testDate      marks

0    John      34             234                2021-04-28      15     2021-03-28       25

如何将Dataframe转换为所需的输出?此更改将基于 Name 行的列。
编辑1
我试过用 pivot_table 但是我没有得到想要的结果。

merged_df_pivot = pd.pivot_table(merged_df, index=["name", "testDate"], aggfunc="first", dropna=False).fillna("")

当我尝试遍历 merged_df_pivot 这样地:

for index, details in merged_df_pivot.iterrows():

我再次得到两行,而且我不能添加新的 testMonth 按上述方法列。

uajslkp6

uajslkp61#

核心是 unstack() 待列月份
然后逐月重新构造明细栏,使其符合所需结构
一般认为错误的做法是列名重复,因此将它们作为后缀

df = pd.read_csv(io.StringIO("""     Name   rollNumber   external_roll_number    testDate      marks 
0    John      34             234               2021-04-28      15 
1    John      34             234               2021-03-28      25
"""), sep="\s+")

df["testDate"] =pd.to_datetime(df["testDate"])
df = df.assign(testMonth = df["testDate"].dt.strftime("%B")).drop(columns="testDate")

dft = (df.set_index([c for c in df.columns if c!="marks"])
 .unstack("testMonth") # make month a column
 .droplevel(0, axis=1) # remove unneeded level in columns
 # create columns for months from column names and rename marks columns
 .pipe(lambda d: d.assign(**{f"testMonth_{i+1}":c 
                             for i,c in enumerate(d.columns)}).rename(columns={c:f"marks_{i+1}" 
                                                                               for i,c in enumerate(d.columns)}))
 .reset_index()
)

输出

姓名登记册号码内部登记册号码标记2测试月1测试月20日4月342341525日

相关问题