【发布时间】:2016-02-17 23:26:47
【问题描述】:
我有DataFrame 和Sales 列。
如何根据Sales 值将其拆分为 2?
第一个DataFrame 将有'Sales' < s 和第二个'Sales' >= s 的数据
【问题讨论】:
标签: python pandas dataframe indexing split
我有DataFrame 和Sales 列。
如何根据Sales 值将其拆分为 2?
第一个DataFrame 将有'Sales' < s 和第二个'Sales' >= s 的数据
【问题讨论】:
标签: python pandas dataframe indexing split
你可以使用boolean indexing:
df = pd.DataFrame({'Sales':[10,20,30,40,50], 'A':[3,4,7,6,1]})
print (df)
A Sales
0 3 10
1 4 20
2 7 30
3 6 40
4 1 50
s = 30
df1 = df[df['Sales'] >= s]
print (df1)
A Sales
2 7 30
3 6 40
4 1 50
df2 = df[df['Sales'] < s]
print (df2)
A Sales
0 3 10
1 4 20
也可以将mask 反转为~:
mask = df['Sales'] >= s
df1 = df[mask]
df2 = df[~mask]
print (df1)
A Sales
2 7 30
3 6 40
4 1 50
print (df2)
A Sales
0 3 10
1 4 20
print (mask)
0 False
1 False
2 True
3 True
4 True
Name: Sales, dtype: bool
print (~mask)
0 True
1 True
2 False
3 False
4 False
Name: Sales, dtype: bool
【讨论】:
mask 与传统切片之间的性能差异是什么?我的测试显示 mask 有点快,但差别不大
使用groupby,您可以拆分为两个数据帧,例如
In [1047]: df1, df2 = [x for _, x in df.groupby(df['Sales'] < 30)]
In [1048]: df1
Out[1048]:
A Sales
2 7 30
3 6 40
4 1 50
In [1049]: df2
Out[1049]:
A Sales
0 3 10
1 4 20
【讨论】:
使用“groupby”和列表理解:
将所有拆分的数据帧存储在列表变量中,并通过索引访问每个分离的数据帧。
DF = pd.DataFrame({'chr':["chr3","chr3","chr7","chr6","chr1"],'pos':[10,20,30,40,50],})
ans = [y for x, y in DF.groupby('chr', as_index=False)]
像这样访问分离的 DF:
ans[0]
ans[1]
ans[len(ans)-1] # this is the last separated DF
像这样访问分离的 DF 的列值:
ansI_chr=ans[i].chr
【讨论】:
ans = [y for x, y in DF.groupby('chr', as_index=False)],因为 y 已经是一个 DataFrame
使用海象运算符的单线(Python 3.8):
df1, df2 = df[(mask:=df['Sales'] >= 30)], df[~mask]
考虑使用copy 来避免SettingWithCopyWarning:
df1, df2 = df[(mask:=df['Sales'] >= 30)].copy(), df[~mask].copy()
或者,你可以使用query的方法:
df1, df2 = df.query('Sales >= 30').copy(), df.query('Sales < 30').copy()
【讨论】:
我喜欢用它来加速搜索或滚动平均查找 .apply(lambda x...) 类型的函数,因此我将大文件拆分为数据框字典:
df_dict = {sale_v: df[df['Sales'] == sale_v] for sale_v in df.Sales.unique()}
如果您想基于分类组,应该这样做。
【讨论】: