簡體   English   中英

Pandas 按列值拆分 DataFrame

[英]Pandas split DataFrame by column value

我有DataFrameSales

如何根據Sales將其拆分為 2?

第一個DataFrame將具有'Sales' < s數據,第二個具有'Sales' >= s數據

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

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

我喜歡用它來加速搜索或滾動平均查找 .apply(lambda x...) 類型的函數,所以我將大文件拆分為數據框字典:

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

如果您想根據分類組進行操作,則應該這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM