熊猫按列值拆分DataFrame


81

我有DataFrame专栏Sales

如何根据Sales价值将其分成2个?

首先DataFrame将具有数据,'Sales' < s其次将具有'Sales' >= s


如何根据列值将数据框拆分为多个数据框?如果要基于'Sales'> s1和'Sales'<s2拆分数据帧?
Ganesh MS

Answers:


107

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

7
有没有一种方法可以不必将数据帧切片两次?因为这样,我们将不得不将索引滚动到onve上以创建df1,而另一次则需要完全相同的条件来创建df2。但是我不知道如何在一行中同时获得两个数据帧
。– ysearka

1
不幸的是,我认为只有这种解决方案-请参阅食谱
jezrael

使用mask传统切片与使用传统切片之间的性能差异是什么?我的测试显示,遮罩的速度

@Mike Palmice Hmm,如果从性能上考虑第一段和第二段,则取决于您哪种方法更好。如果需要多次组合或需要重用掩码,秒应该更好,如果某些较长的复杂掩码,那么秒应该更易读。
jezrael

1
不完全是,但是我通过执行for循环找到了答案。遍历每个唯一的列值,然后通过切片将df除以该值。其实并不太难,我什至不知道为什么要问。不过谢谢
Odisseo

50

使用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

3
尽管从语法
上讲

3
这并不完全等同于jezrael的选择。如果分割后的数据集之一为空,则group by将返回仅包含一个元素的list,并且将无法解压缩为df1和df2。
hgrey

21

使用“ groupby”和列表理解:

将所有拆分的数据帧存储在list变量中,并通过它们的索引访问每个分离的数据帧。

DF = pd.DataFrame({'chr':["chr3","chr3","chr7","chr6","chr1"],'pos':[10,20,30,40,50],})
ans = [pd.DataFrame(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 

这是一个很好的答案!
塔伊尔

9
我认为您可以简化为,ans = [y for x, y in DF.groupby('chr', as_index=False)]因为y已经是一个数据帧
C8H10N4O2 '20年

1
这个答案不取决于拆分的数量。它应该被投票为#1只是需要根据@ C8H10N4O2的评论进行更新
msarafzadeh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.