在给定另一个列子集中的信息的情况下,对Pandas DataFrame中列子集中的行中的项目重新排序

时间:2018-12-12 22:19:55

标签: python pandas dataframe

我有一个熊猫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

E1E3是事件,而EDAY1EDAY3是发生相应事件的日子。请注意:

  • 如果未发生任何事件,则将其标记为“ 0”,并将相应的EDAY设置为-1
  • 事件E1的优先级高于E2,事件E2的优先级高于E3
  • 事件优先级与EDAY不对应(请参见最后一行)
  • 某些事件是在同一天发生的

我希望根据以下条件将这些事件转换为10个字符长的字符串:

  1. 字符串中每个字符的位置大致对应于事件发生的日期
  2. 没有事件的日子将以字符“ 0”表示
  3. 在同一天发生的事件将按照优先级进行排序,并立即设置为彼此相邻(我知道这并不是一种完美的表示方式,但是现在可以使用)

因此,以上面的示例为例,我希望具有以下表示形式:

    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的新手,这让我感到困惑。

1 个答案:

答案 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)