我有一个熊猫DataFrame:
import pandas as pd
e = [{'E1': 'A', 'E2': 'B', 'E3': 'C', 'EDAY1': 0, 'EDAY2': 1, 'EDAY3': 2}, {'E1': 'B', 'E2': '0', 'E3': '0', 'EDAY1': 2, 'EDAY2': -1, 'EDAY3': -1}, {'E1': 'F', 'E2': 'A', 'E3': 'D', 'EDAY1': 5, 'EDAY2': 5, 'EDAY3': 2}]
df = pd.DataFrame(e)
display(df)
输出:
E1 E2 E3 EDAY1 EDAY2 EDAY3
0 A B C 0 1 2
1 B 0 0 2 -1 -1
2 F A D 5 5 2
E1
至E3
是事件,而EDAY1
至EDAY3
是发生相应事件的日子。请注意:
EDAY
设置为-1
E1
的优先级高于E2
,事件E2
的优先级高于E3
EDAY
不对应(请参见最后一行)我希望根据以下条件将这些事件转换为10个字符长的字符串:
因此,以上面的示例为例,我希望具有以下表示形式:
E1 E2 E3 EDAY1 EDAY2 EDAY3 E_STR
0 A B C 0 1 2 ABC0000000
1 B 0 0 2 -1 -1 00B0000000
2 F A D 5 5 2 00D00FA000
请注意,这不是家庭作业,但是我是Python和Pandas的新手,这让我感到困惑。
答案 0 :(得分:1)
请与我分享此问题的方法,我使用wide_to_long
来展平原始数据帧,然后排除-1,并将zip
的所有值都放入{{1}的list
中},结构不好,但不用担心,我们只需要它创建一对值和位置(据我所知,EDAY是char在E中的位置)
list
重塑后,我们使用for循环来创建所需的字符
newdf=pd.wide_to_long(df.reset_index(),['E','EDAY'],i='index',j='drop').loc[lambda x : x.EDAY!=-1]
newdf.EDAY+=newdf.groupby(['index','EDAY']).cumcount()# here is to protect when two position show up same time
newdf=newdf.groupby(level=0).agg(list)