Python 从数据库中的数据帧结果创建字典
我有一个数据框,结果如下。示例数据帧显示实际的数据帧要大得多。我想得到一个字典(或者另一个结构,如果它更快的话),其中的值是通过条件的所有项(位于列标题中),键是dataframe行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
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']}