[英]convert a dict with key and list of values into pandas Dataframe where values are column names
給定這樣的字典:
d={'paris':['a','b'],
'brussels':['b','c'],
'mallorca':['a','d']}
#when doing:
df = pd.DataFrame(d)
df.T
我沒有得到預期的結果。 我想得到的是一個 one_hot_encoding DF,其中的列是大寫字母,值 1 或 0 對應於每個城市包括的每個字母是 paris、mallorca 等
期望的結果是:
df = pd.DataFrame([[1,1,0,0],[0,1,1,0],[1,0,0,1]], index=['paris','brussels','mallorca'], columns=list('abcd'))
df.T
有什么聰明的方法可以做到這一點,而不必對第一個 dict 進行多循環以將其轉換為另一個?
解決方案1:
df.apply
與series.value_counts
和 append df.fillna
用零填充NaN
值。out = df.apply(pd.Series.value_counts).fillna(0)
print(out)
paris brussels mallorca
a 1.0 0.0 1.0
b 1.0 1.0 0.0
c 0.0 1.0 0.0
d 0.0 0.0 1.0
解決方案1:
df.melt
轉換您的df
,然后在pd.crosstab
中使用結果。df.fillna
將NaN
值更改為零。 最后,根據原始df
中的順序對列重新排序。out = df.melt(value_name='index')
out = pd.crosstab(index=out['index'], columns=out['variable'])\
.fillna(0).loc[:, df.columns]
print(out)
paris brussels mallorca
index
a 1 0 1
b 1 1 0
c 0 1 0
d 0 0 1
我不知道我的解決方案有多“聰明”,但它很有效,而且非常簡潔易讀。
import pandas as pd
d = {'paris': ['a', 'b'],
'brussels': ['b', 'c'],
'mallorca': ['a', 'd']}
df = pd.DataFrame(d).T
df.columns = ['0', '1']
df = pd.concat([df['0'], df['1']])
df = pd.crosstab(df, columns=df.index)
print(df)
產量:
brussels mallorca paris
a 0 1 1
b 1 0 1
c 1 0 0
d 0 1 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.