python pandas - 有没有更快的方法根据要求进行爆炸操作
python pandas - is there any faster way to do explode operation according to the requirement
代码如下
输入数据框是
import pandas as pd
import numpy as np
df = pd.DataFrame([('bird', 'Falconiformes', 2),
('bird', 'Psittaciformes', 4),
('mammal', 'Carnivora', 8),
('mammal', 'Primates', np.nan),
('mammal', 'Carnivora', 12)],
index=['falcon', 'parrot', 'lion', 'monkey', 'leopard'],
columns=('class', 'order', 'count'))
unique_class= df['class'].unique().tolist()
temp_list = []
for i in range(len(unique_class)):
temp =df[df['class']==unique_class[i]].reset_index(drop=True)
pipe_values= temp['order'].values.tolist()
count_values=temp['count'].values.tolist()
Stri= "|".join(pipe_values)
for j in range(len(pipe_values)):
df1=temp[:1]
df1['order']= Stri
df1['count'+str(j)]=count_values[j]
temp_list.append(df1)
final = pd.concat(temp_list)
final
输出是
问题是当大量数据到来时——大约 100 万——过程很慢,pandas 中是否有我们可以做的任何其他逻辑或内置函数,还有我将如何使用 vaex 库来做
谢谢
您可以在 Pandas 内完成(不确定为什么需要以这种方式合并数据):
Groupby on class
,将所有内容转换为字符串,并与 python 的 str.join
:
聚合
temp = df.set_index('class').astype(str).groupby(level=[0]).agg("|".join)
将 count
拆分为单独的列并与 temp
重新组合:
anoda = (temp['count'].str.split("|", expand=True)
.astype(float)
.add_prefix('count')
)
temp.join(anoda).drop(columns='count')
order count0 count1 count2
class
bird Falconiformes|Psittaciformes 2.0 4.0 NaN
mammal Carnivora|Primates|Carnivora 8.0 NaN 12.0
代码如下
输入数据框是
import pandas as pd
import numpy as np
df = pd.DataFrame([('bird', 'Falconiformes', 2),
('bird', 'Psittaciformes', 4),
('mammal', 'Carnivora', 8),
('mammal', 'Primates', np.nan),
('mammal', 'Carnivora', 12)],
index=['falcon', 'parrot', 'lion', 'monkey', 'leopard'],
columns=('class', 'order', 'count'))
unique_class= df['class'].unique().tolist()
temp_list = []
for i in range(len(unique_class)):
temp =df[df['class']==unique_class[i]].reset_index(drop=True)
pipe_values= temp['order'].values.tolist()
count_values=temp['count'].values.tolist()
Stri= "|".join(pipe_values)
for j in range(len(pipe_values)):
df1=temp[:1]
df1['order']= Stri
df1['count'+str(j)]=count_values[j]
temp_list.append(df1)
final = pd.concat(temp_list)
final
输出是
问题是当大量数据到来时——大约 100 万——过程很慢,pandas 中是否有我们可以做的任何其他逻辑或内置函数,还有我将如何使用 vaex 库来做 谢谢
您可以在 Pandas 内完成(不确定为什么需要以这种方式合并数据):
Groupby on class
,将所有内容转换为字符串,并与 python 的 str.join
:
temp = df.set_index('class').astype(str).groupby(level=[0]).agg("|".join)
将 count
拆分为单独的列并与 temp
重新组合:
anoda = (temp['count'].str.split("|", expand=True)
.astype(float)
.add_prefix('count')
)
temp.join(anoda).drop(columns='count')
order count0 count1 count2
class
bird Falconiformes|Psittaciformes 2.0 4.0 NaN
mammal Carnivora|Primates|Carnivora 8.0 NaN 12.0