在pandas中拆分和复制一行

时间:2017-05-23 09:35:32

标签: python pandas dataframe duplicates rows

我的任务完全让我发疯。让我们假设我们有这个df:

import pandas as pd

k = {'random_col':{0:'a',1:'b',2:'c'},'isin':{0:'ES0140074008', 1:'ES0140074008ES0140074010', 2:'ES0140074008ES0140074016ES0140074024'},'n_isins':{0:1,1:2,2:3}}

k = pd.DataFrame(k)

我想做的是通过col n_isins对行进行多次或三次加倍,这是通过将col isin的lentgh除以12获得的数字,因为isins总是12个字符的字符串。

所以,我需要1次0行,2次1行和3次行2.我的实数上限为6,因此这是一项艰巨的任务。我开始使用布尔并切割col isin,但这并没有让我一无所获。希望我的解释足够好。另外我需要像这样[0:11] +' ' + [12:23] ...由E'分裂但我想我知道怎么做,我只是发布它因为是规则我必须复制每一行的次数的标准。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您需要numpy.repeat loc,最后删除reset_index索引中的重复项。最后一个新列使用自定义拆分功能numpy.concatenate

n = np.repeat(k.index, k['n_isins'])
k = k.loc[n].reset_index(drop=True)
print (k)
                                   isin  n_isins random_col
0                          ES0140074008        1          a
1              ES0140074008ES0140074010        2          b
2              ES0140074008ES0140074010        2          b
3  ES0140074008ES0140074016ES0140074024        3          c
4  ES0140074008ES0140074016ES0140074024        3          c
5  ES0140074008ES0140074016ES0140074024        3          c

#https://stackoverflow.com/a/7111143/2901002
def chunks(s, n):
    """Produce `n`-character chunks from `s`."""
    for start in range(0, len(s), n):
        yield s[start:start+n]

s = np.concatenate(k['isin'].apply(lambda x: list(chunks(x, 12))))
df['new'] = pd.Series(s, index = df.index)
print (df)
                                   isin  n_isins random_col           new
0                          ES0140074008        1          a  ES0140074008
1              ES0140074008ES0140074010        2          b  ES0140074008
2              ES0140074008ES0140074010        2          b  ES0140074010
3  ES0140074008ES0140074016ES0140074024        3          c  ES0140074008
4  ES0140074008ES0140074016ES0140074024        3          c  ES0140074016
5  ES0140074008ES0140074016ES0140074024        3          c  ES0140074024