我有一个字典,城市名称作为键,对应每个城市都有一个日期列表。例如:
{
'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
答案 0 :(得分:3)
或者我们可以使用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
答案 1 :(得分:2)
使用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' solution的类似信息:
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
答案 2 :(得分:1)
您可以使用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
答案 3 :(得分:1)
您可以在创建('A', '2017-01-01')
之前将数据重新处理为名称和日期元组列表,例如:DataFrame
。
试试这个:
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