熊猫按列值拆分数据框架

我有 DataFrameSales列。

如何根据 Sales值将其拆分为2?

第一个 DataFrame将有数据与 'Sales' < s和第二与 'Sales' >= s

298770 次浏览

你可以使用 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

使用 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')]

像这样访问分离的 DF:

ans[0]
ans[1]
ans[len(ans)-1] # this is the last separated DF

访问分离的 DF 的列值如下:

ansI_chr=ans[i].chr

使用 walrus 操作符的一行程序(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()

我喜欢使用它来加速搜索或滚动平均发现。应用(lambda x。.)类型函数,所以我把大文件分割成数据框架的字典:

df_dict = {sale_v: df[df['Sales'] == sale_v] for sale_v in df.Sales.unique()}

如果你想基于绝对分类群,这个应该可以做到。