使字典键成为行,字典值成为列,一个值作为列名,一个值作为列值
Make dictionary keys into rows and dict values as columns with one value as column name and one as column value
我有以下数据:
print(tables['T10101'].keys())
dict_keys(['Y033RL', 'A007RL', 'A253RL', 'A646RL', 'A829RL', 'A008RL', 'A191RP', 'DGDSRL', 'A822RL', 'A824RL', 'A006RL', 'A825RL', 'A656RL', 'A823RL', 'Y001RL', 'DNDGRL', 'DDURRL', 'A021RL', 'A009RL', 'A020RL', 'DSERRL', 'A011RL', 'DPCERL', 'A255RL', 'A191RL'])
每个键都有以下值,一个元组列表:
日期相同但值发生变化。
[('-20.7', '1930'), ('-33.3', '1931'), ('-41.4', '1932'), ('2.5', '1933'), ('38.3', '1934'), ('36.3', '1935'), ('37.2', '1936'), ('16.2', '1937'), ('-30.4', '1938'), ('15.4', '1939'), ('29.6', '1940'), ('17.2', '1941'), ('-42.6', '1942'), ('-10.2', '1943'), ('33.7', '1944'), ('43.2', '1945'), ('24.7', '1946'), ('36.0', '1947'), ('-8.3', '1947Q2'),
我想创建以下数据框:
1930 | 1931 | 1932 | 1933 | 1934 |
Y033RL|-20.7| -33.3| -41.4| 2.5 | 38.3 |
A007RL| data| data | data | data | data |
最好的方法是什么?我想出了这种加入创建的数据帧的迂回方式,但由于我有很多数据,所以效率很低。我想先把所有的东西都放在字典里,然后把它转换成一个数据框。
def dframeCreator(dataname):
dframeList = list(tables[dataname].keys())
df = tables[dataname][dframeList[0]]
for x in range(len(dframeList[1:])):
df = df.join(tables[dataname][dframeList[x+1]])
return df
如果 tables
是你的字典,你可以这样做:
df = pd.DataFrame(
[{"idx": k, **dict([(b, a) for a, b in v])} for k, v in tables.items()],
).set_index("idx")
df.index.name = None
print(df)
打印:
1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1947Q2
T10101 -20.7 -33.3 -41.4 2.5 38.3 36.3 37.2 16.2 -30.4 15.4 29.6 17.2 -42.6 -10.2 33.7 43.2 24.7 36.0 -8.3
A007RL xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx
我们可以使用dict
理解以适合创建数据框的标准格式规范化给定的字典
d = tables['T10101']
df = pd.DataFrame({k: dict(map(reversed, v)) for k, v in d.items()}).T
print(df)
1930 1931 1932 1933 ... 1945 1946 1947 1947Q2
Y033RL -20.7 -33.3 -41.4 2.5 ... 43.2 24.7 36.0 -8.3
我有以下数据:
print(tables['T10101'].keys())
dict_keys(['Y033RL', 'A007RL', 'A253RL', 'A646RL', 'A829RL', 'A008RL', 'A191RP', 'DGDSRL', 'A822RL', 'A824RL', 'A006RL', 'A825RL', 'A656RL', 'A823RL', 'Y001RL', 'DNDGRL', 'DDURRL', 'A021RL', 'A009RL', 'A020RL', 'DSERRL', 'A011RL', 'DPCERL', 'A255RL', 'A191RL'])
每个键都有以下值,一个元组列表: 日期相同但值发生变化。
[('-20.7', '1930'), ('-33.3', '1931'), ('-41.4', '1932'), ('2.5', '1933'), ('38.3', '1934'), ('36.3', '1935'), ('37.2', '1936'), ('16.2', '1937'), ('-30.4', '1938'), ('15.4', '1939'), ('29.6', '1940'), ('17.2', '1941'), ('-42.6', '1942'), ('-10.2', '1943'), ('33.7', '1944'), ('43.2', '1945'), ('24.7', '1946'), ('36.0', '1947'), ('-8.3', '1947Q2'),
我想创建以下数据框:
1930 | 1931 | 1932 | 1933 | 1934 |
Y033RL|-20.7| -33.3| -41.4| 2.5 | 38.3 |
A007RL| data| data | data | data | data |
最好的方法是什么?我想出了这种加入创建的数据帧的迂回方式,但由于我有很多数据,所以效率很低。我想先把所有的东西都放在字典里,然后把它转换成一个数据框。
def dframeCreator(dataname):
dframeList = list(tables[dataname].keys())
df = tables[dataname][dframeList[0]]
for x in range(len(dframeList[1:])):
df = df.join(tables[dataname][dframeList[x+1]])
return df
如果 tables
是你的字典,你可以这样做:
df = pd.DataFrame(
[{"idx": k, **dict([(b, a) for a, b in v])} for k, v in tables.items()],
).set_index("idx")
df.index.name = None
print(df)
打印:
1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1947Q2
T10101 -20.7 -33.3 -41.4 2.5 38.3 36.3 37.2 16.2 -30.4 15.4 29.6 17.2 -42.6 -10.2 33.7 43.2 24.7 36.0 -8.3
A007RL xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx
我们可以使用dict
理解以适合创建数据框的标准格式规范化给定的字典
d = tables['T10101']
df = pd.DataFrame({k: dict(map(reversed, v)) for k, v in d.items()}).T
print(df)
1930 1931 1932 1933 ... 1945 1946 1947 1947Q2
Y033RL -20.7 -33.3 -41.4 2.5 ... 43.2 24.7 36.0 -8.3