将Pandas数据帧转换为N对1字典,其中N列是指向单个列的键作为值

时间:2017-10-22 00:39:43

标签: python pandas dictionary

我想从Pandas数据框中创建一个字典,其中N列中的每一行都指向单个列中的值,并且想知道是否有一种有效的方法来执行此操作而无需构建一堆for循环和字典更新。

例如,是一种更具编程性/ Pandas的方式来实现以下目标。

import pandas as pd
columns = ["A", "B", "C"]
data = [[1, 11, 111],
        [2, 22, 222],
        [3, 33, 333]]
df = pd.DataFrame(data=data, columns=columns)
df

Out[1]:
    A   B   C
0   1   11  111
1   2   22  222
2   3   33  333


mdict = {}
for c in df.columns:
    mdict.update(dict(zip(df[c], df['A'])))
mdict

Out[2]:
{1: 1, 2: 2, 3: 3, 11: 1, 22: 2, 33: 3, 111: 1, 222: 2, 333: 3}

我最终试图创建一个长键字典,所有键都指向相同的值,这样我就可以转到另一个数据帧并应用map函数来标准化条目。这个字典步骤是否需要,或者是否有更简单的方法来完成此操作而无需通过中间字典?谢谢!

df2 = pd.DataFrame(data=[1, 11, 111, 2, 22, 222, 3, 33, 333], columns=['D'])
df2['D'] = df2['D'].map(mdict)
df2

Out[3]:
    D
0   1
1   1
2   1
3   2
4   2
5   2
6   3
7   3
8   3

1 个答案:

答案 0 :(得分:1)

另一种方法是:

g = df.set_index('A', drop=False).unstack()
m = dict(zip(g.values,  g.index.get_level_values(1)))

m
{1: 1, 2: 2, 3: 3, 11: 1, 22: 2, 33: 3, 111: 1, 222: 2, 333: 3}

df1.D.map(m)

0    1
1    1
2    1
3    2
4    2
5    2
6    3
7    3
8    3
Name: D, dtype: int64

以类似的方式,您可以将pd.Series对象传递给地图。

s = pd.Series(g.index.get_level_values(1), index=g.values)
s

1      1
2      2
3      3
11     1
22     2
33     3
111    1
222    2
333    3
Name: A, dtype: int64

df1.D.map(s)

0    1
1    1
2    1
3    2
4    2
5    2
6    3
7    3
8    3
Name: D, dtype: int64