Pandas 0.19.0 explode() 解决方法

Pandas 0.19.0 explode() workaround

大家好!

我需要 pandas 0.19.0 中 explode() 的替代方案或解决方法方面的帮助 我有这个 csv 文件

  item        CODE
0 apple       REDGRNYLW
1 strawberry  REDWHT
2 corn        YLWREDPRLWHTPNK

我需要得到这个结果

  item        CODE
1 apple       RED
2 apple       GRN
3 apple       YLW
4 strawberry  RED
5 strawberry  WHT
6 corn        YLW
7 corn        RED
8 corn        PRL
9 corn        WHT
10 corn       PNK

我设法使用 pandas 1.3.3 得到了结果,这是我所做的

import pandas as pd

filename = r'W:\plant_CODE.csv'

df2 = pd.read_csv(filename)

def split_every_3_char(string):
    return [string[i:i+3] for i in range(0, len(string), 3)]

df2.columns = ['item', 'CODE']
df_splitted = (df2.set_index(df2.columns.drop('CODE', 1).tolist())
    .CODE.apply(lambda x: split_every_3_char(x))
    .explode()
    .to_frame()
    .reset_index()
)

print(df_splitted)

不幸的是,我刚刚意识到我仅限于 pandas 0.19.0 explode() 尚不可用。

Traceback (most recent call last):
   File "<string>", line 69, in <module>
   File "lib\site-packages\pandas\core\generic.py", line 2744, in __getattr__
 AttributeError: 'Series' object has no attribute 'explode'

我将不胜感激任何解决方案或解决方法。 谢谢!

csv_file

将函数的输出转换为 Series 并使用 DataFrame.stack:

df_splitted = (df2.set_index(df2.columns.drop('CODE', 1).tolist())
    .CODE.apply(lambda x: pd.Series(split_every_3_char(x)))
    .stack()
    .reset_index(-1, drop=True)
    .reset_index(name='CODE')
)

print(df_splitted)
         item CODE
0       apple  RED
1       apple  GRN
2       apple  YLW
3  strawberry  RED
4  strawberry  WHT
5        corn  YLW
6        corn  RED
7        corn  PRL
8        corn  WHT
9        corn  PNK

如何从列表理解和加入中制作一个系列?

l = [[i, x[3*i:3*(i+1)]] for i,x in zip(df.index, df['CODE'])
      for i in range(len(x)//3)]
s = pd.DataFrame(l, columns=['index', 'CODE']).set_index('index')['CODE']
df[['item']].join(s)

输出:

         item CODE
0       apple  RED
0       apple  RED
0       apple  YLW
1  strawberry  GRN
1  strawberry  WHT
1  strawberry  RED
2        corn  YLW
2        corn  PRL