按列扩展行,同时根据值处理其他行

时间:2019-07-11 23:21:22

标签: python pandas dataframe

我有一个这样的DataFrame:

  column1  column2  column3
0       a        2        2
1       b        1        0
2       c        3        2

第3列中的值必须为<=第2列中的值

我想根据以下规则将df扩展到下面:

  column1  column2  column3
0       a        1        1
1       a        1        1
2       b        1        0
3       c        1        1
4       c        1        1
5       c        1        0
  1. 每行都被扩展为与column2中的值相等的行数
  2. 如果列3的索引(相对于column1分组)小于列3中原始未扩展的行的值,则列3的值等于1。

例如: 看到column1 = a的行被扩展为2行,因为它的column2值等于2,并且由于0 <2和1 <2,两个结果扩展行在column3中的值都为1。

看到column1 = c的行被扩展为3行,因为它的column2值等于3,但是,只有前2个扩展行在column3中的值为1(再次:0 <2和1 < 2),但是,第三扩展行的column3的值为0,因为(是,是,这不是幼儿园数学)2 <2是不正确的。

我可以在第一个给定的数据帧上使用什么功能,以获得类似于第二个的结果?

2 个答案:

答案 0 :(得分:2)

np.repeat + cumcount

u = pd.DataFrame(np.repeat(df.values, df.column2, axis=0), columns=df.columns)

u.assign(
  column2=1,
  column3=(u.column3 > u.groupby('column1').cumcount()).astype(int)
)

  column1  column2  column3
0       a        1        1
1       a        1        1
2       b        1        0
3       c        1        1
4       c        1        1
5       c        1        0

答案 1 :(得分:1)

我认为这是合并问题

s1=df.loc[df.index.repeat(df.column2),['column1']].assign(column2=1).reset_index(drop=True)
s2=df.loc[df.index.repeat(df.column3),['column1']].assign(column3=1).reset_index(drop=True)
df=s1.assign(Key=s1.groupby(s1.column1).cumcount()).merge(s2.assign(Key=s2.groupby(s2.column1).cumcount()),how='left').fillna(0)
df

  column1  column2  Key  column3
0       a        1    0      1.0
1       a        1    1      1.0
2       b        1    0      0.0
3       c        1    0      1.0
4       c        1    1      1.0
5       c        1    2      0.0
相关问题