pandas 根据两列的函数复制行

oipij1gg  于 2022-12-21  发布在  其他
关注(0)|答案(2)|浏览(98)

我最初的示例 Dataframe 格式如下:

>>> import pandas as pd
>>> d = {'n': ['one', 'two', 'three', 'four'],
         'initial': [3, 4, 10, 10],
         'final': [3, 7, 11, 7],}
>>> df = pd.DataFrame(d)
>>> df
       n  initial  final
0    one        3      3
1    two        4      7
2  three       10     11
3   four       10      7

我希望实现的是将n列中的值复制若干次,复制次数对应于initialfinal列中的值之间的值。
例如,在第一行中,initialfinal具有相同的值,因此在输出 Dataframe 的n列中应该有'one'的一个示例。对于第二行,initialfinal相差三个数字,因此'two'应该有四个重复。如果final小于initial,则在输出中不应该有n中的值的示例。
还应该有一个count列,从initial列的值向上计数到final列的值。

n  count
0    one      3
1    two      4
2    two      5
3    two      6
4    two      7
5  three     10
6  three     11

我尝试过使用reindex和基于df.final - df.initial + 1的新索引,但这不能处理示例 Dataframe 第四行中的负值。

ifmq2ha2

ifmq2ha21#

在您的情况下,先创建list,然后创建explode

# in order to save running time , df = df.query('initial<=final')
df['count'] = [ range(x, y + 1) for x, y in zip(df['initial'], df['final'])]
out = df.explode('count').dropna()
Out[13]: 
       n  initial  final count
0    one        3      3     3
1    two        4      7     4
1    two        4      7     5
1    two        4      7     6
1    two        4      7     7
2  three       10     11    10
2  three       10     11    11
t3psigkw

t3psigkw2#

out = (df[['n']].join(df.apply(lambda x: range(x[1], x[2] + 1), axis=1)
                      .explode().to_frame('count'))
       .dropna(subset=['count']))

第一个月

n  count
0    one      3
1    two      4
2    two      5
3    two      6
4    two      7
5  three     10
6  three     11

相关问题