我有一個熊貓數據幀如下:如何做到比pandas DataFrame大/小於binning?
import pandas as pd
import numpy as np
data = {"first_column": ["item1", "item2", "item3", "item4", "item5", "item6", "item7"],
"second_column": ["cat1", "cat1", "cat1", "cat2", "cat2", "cat2", "cat2"],
"third_column": [5, 1, 8, 3, 731, 189, 9]}
df = pd.DataFrame(data)
df
first_column second_column third_column
0 item1 cat1 5
1 item2 cat1 1
2 item3 cat1 8
3 item4 cat2 3
4 item5 cat2 731
5 item6 cat2 189
6 item7 cat2 9
現在,讓我們說,我想創造出使用pandas.cut()
第三列的分類第四列。在這裏,我將每行標註third_column
中的元素是否小於或等於10,<=10
。
df["less_than_ten"]= pd.cut(df.third_column, [-np.inf, 10, np.inf], labels=(1,0))
並將所得數據幀現在爲:
first_column second_column third_column less_than_ten
0 item1 cat1 5 1
1 item2 cat1 1 1
2 item3 cat1 8 1
3 item4 cat2 3 1
4 item5 cat2 731 0
5 item6 cat2 189 0
6 item7 cat2 9 1
問題:注意第二列second_column
,與類別cat1
和cat2
。如何根據second_column
中的「班級」使用pandas.cut()
重新分類這些值?
更重要的是,假設我想要更復雜的時間間隔,例如,小於或等於500 le(500)且大於或等於20 ge(20)?這將如何完成?在這種情況下,應該通過分組打成1:
df['less_than_ten'] = df.third_column.le(10).astype(np.uint8)
df.loc[df.second_column=='cat2','less_than_ten'] = \
df.loc[df.second_column=='cat2','third_column'].le(10).astype(np.uint8) + 2
結果:
In [99]: df
Out[99]:
first_column second_column third_column less_than_ten
0 item1 cat1 5 1
1 item2 cat1 1 1
2 item3 cat1 8 1
3 item4 cat2 3 3
4 item5 cat2 731 2
5 item6 cat2 189 2
6 item7 cat2 9 3
這適用於「少於10」。那麼「少於1000且超過20」呢? – ShanZhengYang
@尚正陽,你能不能相應地更新你的問題?現在還不是很清楚... – MaxU