簡體   English   中英

將帶有鍵和值列表的 dict 轉換為 pandas Dataframe ,其中值是列名

[英]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:

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.fillnaNaN值更改為零。 最后,根據原始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.

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