对数据框中某一列子集中的行中的项重新排序另一列子集中的给定信息

2024-09-28 05:38:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

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的优先级大于E2E2的优先级大于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和熊猫新手,这让我难堪


Tags: 数据字符串importpandasdf事件字符pd
1条回答
网友
1楼 · 发布于 2024-09-28 05:38:18

我用wide_to_long将原始数据帧展平,然后排除-1和zip将所有值放入listlist中,结构不好,但不用担心,我们只需要它创建一对值和位置(在我的理解中,EDAY是E中字符的位置)

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)

在beyond重塑之后,我们使用for循环来创建您需要的字符

l=[]
for x ,y in zip(newdf.E,newdf.EDAY):
    xvar=list('0000000000')
    for idx,z in enumerate(y):
        xvar[z]=x[idx]
    l.append(''.join(xvar))
l
Out[111]: ['ABC0000000', '00B0000000', '00D00FA000']

相关问题 更多 >

    热门问题