Python 从数据库中的数据帧结果创建字典

Python 从数据库中的数据帧结果创建字典,python,pandas,Python,Pandas,我有一个数据框,结果如下。示例数据帧显示实际的数据帧要大得多。我想得到一个字典(或者另一个结构,如果它更快的话),其中的值是通过条件的所有项(位于列标题中),键是dataframe行 AAPL GOOG MSFT AMZN FB 1 NaN NaN 9.731 NaN NaN 2 NaN 4.5 NaN 3.486 NaN 3 4.331 NaN NaN 3.26 5.9

我有一个数据框,结果如下。示例数据帧显示实际的数据帧要大得多。我想得到一个字典(或者另一个结构,如果它更快的话),其中的值是通过条件的所有项(位于列标题中),键是dataframe行

    AAPL    GOOG    MSFT    AMZN    FB
1   NaN      NaN    9.731   NaN     NaN
2   NaN      4.5    NaN     3.486   NaN
3   4.331    NaN    NaN     3.26    5.967
4   NaN      NaN    NaN      NaN    3.61
我想要的结果如下

{1:[MSFT], 2:[GOOG,AMZN], 3:[AAPL, AMZN, FB], 4:[FB]}

也许性能不是最好的,但您可以使用ItErrors:

import numpy as np
results = {}
for i, row in df.iterrows():
    results[i] = list(df.columns[~np.isnan(row)])

可以对字典中的dataframe列执行布尔索引

>>> {idx: df.columns[row].tolist() for idx, row in df.notnull().iterrows()}
{1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']}

您可以获得掩码和列的点积,然后使用字符串操作,即

df.notna().dot(df.columns+',').str.strip(',').str.split(',').to_dict()

{1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']}

您可以使用
.apply

df.apply(lambda x: list(x.dropna().index), axis=1).to_dict()       #Updated answer
# Or dict(df.apply(lambda x: list(x.index[~x.isnull()]), axis=1))  #Original answer
输出:

{1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']}

很好,使用
stack
来摆脱NAN。请注意,.notna()仅适用于@kitman0804是的,您可以使用
.notnull()
,无论如何这个答案会变老,让它以最新的形式出现,我已经对您的答案进行了更新投票。
df.stack().reset_index(level=1).groupby(level=0).level_1.apply(list).to_dict()
Out[764]: {1: ['MSFT'], 2: ['GOOG', 'AMZN'], 3: ['AAPL', 'AMZN', 'FB'], 4: ['FB']}