[英]Pandas split DataFrame by column value
我有DataFrame
列Sales
。
如何根據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.