![](/img/trans.png)
[英]Converting a dictionary with values as list of dictionaries into pandas DataFrame
[英]Converting dictionary with values in List to Pandas DataFrame
我有一個字典,城市名稱作為鍵,對應每個城市有一個日期列表。 例如:
{
'A':['2017-01-02','2017-01-03'],
'B':['2017-02-02','2017-02-03','2017-02-04','2017-02-05'],
'C':['2016-02-02']
}
我想將其轉換為包含2列的以下數據幀。
City_Name Date
A 2017-01-02
A 2017-01-03
B 2017-02-02
B 2017-02-03
B 2017-02-04
B 2017-02-05
C 2016-02-02
或者我們可以使用melt
pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in d.items() ])).melt().dropna()
Out[51]:
variable value
0 A 2017-01-02
1 A 2017-01-03
4 B 2017-02-02
5 B 2017-02-03
6 B 2017-02-04
7 B 2017-02-05
8 C 2016-02-02
一種受piR啟發的方式
pd.Series(d).apply(pd.Series).melt().dropna()
Out[142]:
variable value
0 0 2017-01-02
1 0 2017-02-02
2 0 2016-02-02
3 1 2017-01-03
4 1 2017-02-03
7 2 2017-02-04
10 3 2017-02-05
使用numpy.repeat
重復keys
:
#get lens of lists
a = [len(x) for x in d.values()]
#flattening values
b = [i for s in d.values() for i in s]
df = pd.DataFrame({'City_Name':np.repeat(list(d.keys()), a), 'Date':b})
print (df)
City_Name Date
0 C 2016-02-02
1 B 2017-02-02
2 B 2017-02-03
3 B 2017-02-04
4 B 2017-02-05
5 A 2017-01-02
6 A 2017-01-03
另一個類似Danh Pham的解決方案 ,歸功於他:
df = pd.DataFrame([(i, day) for i,j in d.items() for day in j],
columns=['City_Name','Date'])
print(df)
City_Name Date
0 C 2016-02-02
1 B 2017-02-02
2 B 2017-02-03
3 B 2017-02-04
4 B 2017-02-05
5 A 2017-01-02
6 A 2017-01-03
您可以使用DataFrame.from_dict
(僅當列表具有相同的長度時)
將pandas導入為pd
將pandas導入為pd
d = {
'A':['2017-01-02','2017-01-03'],
'B':['2017-02-02','2017-02-03','2017-02-04','2017-02-05'],
'C':['2016-02-02']
}
df = pd.DataFrame.from_dict(d, orient='index').stack().reset_index()
df.columns = ["City_Name", "A", "Date"]
del df["A"]
print(df)
RES:
City_Name Date
0 B 2017-02-02
1 B 2017-02-03
2 B 2017-02-04
3 B 2017-02-05
4 A 2017-01-02
5 A 2017-01-03
6 C 2016-02-02
在創建DataFrame
之前('A', '2017-01-01')
您可以將數據重新處理為名稱和日期元組的列表,例如:( ('A', '2017-01-01')
。
試試這個:
import pandas as pd
data = {
'A':['2017-01-02','2017-01-03'],
'B':['2017-02-02','2017-02-03','2017-02-04','2017-02-05'],
'C':['2016-02-02']
}
pd.DataFrame([(i[0], day) for i in data.items() for day in i[1]])
輸出:
0 1
0 A 2017-01-02
1 A 2017-01-03
2 C 2016-02-02
3 B 2017-02-02
4 B 2017-02-03
5 B 2017-02-04
6 B 2017-02-05
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.