Pandas按列值拆分DataFrame

时间:2015-11-16 18:58:36

标签: python pandas dataframe indexing split

DataFrameSales

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

首先DataFrame的数据为'Sales' < s,其次为'Sales' >= s

4 个答案:

答案 0 :(得分:55)

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

答案 1 :(得分:22)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

带有 Python 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()
相关问题