我在Python Pandas中有一个广泛的数据框,如下所示:
import pandas as pd
import numpy as np
df = pd.DataFrame({'student_id' :[100, 101, 102],
'q1.cta1_count':[0, 1, 1],
'q1.cta1_date' :[np.nan, '2019-03-26', '2019-03-25' ],
'q1.cta1.reminder_count' :[0, 1, 0],
'q1.cta1.reminder_date' :[np.nan, '2019-03-31', np.nan]})
df
并且我需要转换为长格式,以便它看起来像这样的数据帧:
# student_id type count date
# 100 q1.cta1 0 NaN
# 100 q1.cta1.reminder 0 NaN
# 101 q1.cta1 1 2019-03-26
# 101 q1.cta1.reminder 1 2019-03-31
# 102 q1.cta1 1 2019-03-25
# 102 q1.cta1.reminder 0 NaN
我怎样才能做到这一点?
您可以使用从宽到长的pandas,但是首先需要重塑列以适合从宽到长格式的pandas:
df.columns = ["_".join(entry.split("_")[::-1])
if entry.endswith(("count", "date"))
else entry
for entry in df.columns]
现在,您可以重塑数据:
pd.wide_to_long(df,
["count", "date"],
i="student_id",
j="type",
sep="_",
suffix=".+").reset_index()
student_id type count date
0 100 q1.cta1 0 NaN
1 101 q1.cta1 1 2019-03-26
2 102 q1.cta1 1 2019-03-25
3 100 q1.cta1.reminder 0 NaN
4 101 q1.cta1.reminder 1 2019-03-31
5 102 q1.cta1.reminder 0 NaN
另外,您可以使用pyjanitor的ivot_longer函数,该函数是基于pandas的melt函数构建的,并提供了更多的灵活性(全面披露,我是该库的撰稿人):
import pyjanitor
df.pivot_longer(index="student_id",
names_to=("type", ".value"),
names_sep="_")
student_id type count date
0 100 q1.cta1 0 NaN
1 100 q1.cta1.reminder 0 NaN
2 101 q1.cta1 1 2019-03-26
3 101 q1.cta1.reminder 1 2019-03-31
4 102 q1.cta1 1 2019-03-25
5 102 q1.cta1.reminder 0 NaN
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句