我有一個這樣的資料框:
l1 = [1,2,3,1,2,3]
l2 = ['A','A','A','B','B','B']
values = [['Ram', 'Ford', 'Honda', 'Ford'],['Ford', 'Toyota', 'Subaru'],['Ford', 'Ram'],['Volvo', 'Honda', 'Ford'],['Honda', 'Ford', 'Toyota', 'Ford'],['Ram', 'Ford']]
d = {'ID': l1, 'Group': l2, 'Values': values}
df = pd.DataFrame(d)
df
ID Group Values
1 A [Ram, Ford, Honda, Ford]
2 A [Ford, Toyota, Subaru]
3 A [Ford, Ram]
1 B [Volvo, Honda, Ford]
2 B [Honda, Ford, Toyota, Ford]
3 B [Ram, Ford]
我想對資料進行分組,以便對于每個 ID,我得到每個組中每個值的計數,如下所示:
ID
Group Value 1 2 3
A Ram 1 0 1
A Ford 2 1 1
A Honda 1 0 0
A Toyota 0 1 0
A Subaru 0 1 0
B Volvo 1 0 0
B Honda 1 1 0
B Ford 1 2 1
B Toyota 0 1 0
B Ram 0 0 1
誰能幫我這個?
uj5u.com熱心網友回復:
首先explode
是帶有串列的列,然后groupby.size
是想要的數字和unstack
想要的形狀。
res = (
df.explode('Values')
.groupby(['Group','Values','ID']).size()
.unstack('ID',fill_value=0)
.reset_index() # if necessary
)
print(res)
# ID Group Values 1 2 3
# 0 A Ford 2 1 1
# 1 A Honda 1 0 0
# 2 A Ram 1 0 1
# 3 A Subaru 0 1 0
# 4 A Toyota 0 1 0
# 5 B Ford 1 2 1
# 6 B Honda 1 1 0
# 7 B Ram 0 0 1
# 8 B Toyota 0 1 0
# 9 B Volvo 1 0 0
uj5u.com熱心網友回復:
與其他答案類似,這實際上是一個資料透視表。
out = (df.explode('Values')
.pivot_table(index=['Group','Values'],
columns='ID',
aggfunc=lambda x: len(x),
fill_value=0)
.reset_index())
輸出
ID Group Values 1 2 3
0 A Ford 2 1 1
1 A Honda 1 0 0
2 A Ram 1 0 1
3 A Subaru 0 1 0
4 A Toyota 0 1 0
5 B Ford 1 2 1
6 B Honda 1 1 0
7 B Ram 0 0 1
8 B Toyota 0 1 0
9 B Volvo 1 0 0
uj5u.com熱心網友回復:
這是一種使用explode()
和的方法value_counts()
df.explode('Values').value_counts().unstack(level=0).fillna(0)
輸出:
ID 1 2 3
Group Values
A Ford 2.0 1.0 1.0
Honda 1.0 0.0 0.0
Ram 1.0 0.0 1.0
Subaru 0.0 1.0 0.0
Toyota 0.0 1.0 0.0
B Ford 1.0 2.0 1.0
Honda 1.0 1.0 0.0
Ram 0.0 0.0 1.0
Toyota 0.0 1.0 0.0
Volvo 1.0 0.0 0.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507954.html
標籤:Python python-3.x 熊猫 数据框