Python 在匹配条件的数据框中查找列名及其各自的值,并将结果存储在字典中

Python 在匹配条件的数据框中查找列名及其各自的值,并将结果存储在字典中,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个pandas数据框(称为df),我在其中搜索每一行(即在给定日期)值小于0.5的列。在下面的屏幕截图中,我突出显示了小于0.5的值(黄色) df数据帧如下所示: data = {'Date': ['2020-12-22','2020-12-23','2020-12-24','2020-12-25'], 'A': ['0.065','0.965','0.363','0.774'], 'B': ['0.292','0.367','0.396','0.484'], '

我有一个pandas数据框(称为df),我在其中搜索每一行(即在给定日期)值小于0.5的列。在下面的屏幕截图中,我突出显示了小于0.5的值(黄色)

df数据帧如下所示:

data = {'Date': ['2020-12-22','2020-12-23','2020-12-24','2020-12-25'],
    'A': ['0.065','0.965','0.363','0.774'],
    'B': ['0.292','0.367','0.396','0.484'],
    'C': ['0.078','0.489','0.095','0.781'],
    'D': ['0.703','0.748','0.631','0.612']}

df = config.pd.DataFrame (data, columns = ['Date','A', 'B', 'C', 'D'])
我想将结果存储在一个字典中,该字典应类似于下面的嵌套字典:


有人能帮我提供一个示例代码吗。

试试下面的方法。我知道res=。。。这句话不像大多数的听写理解那样可读性很差,但它更简洁。如果您需要一个更可编辑的解决方案,可以通过几个循环ifs轻松完成

d=df.to_dict(orient='records')

res={i['Date']:{k:float(i[k]) for k in i if k!='Date' and float(i[k])<0.5} for i in d}

>>>print(res)

{'2020-12-22': {'A': 0.065, 'B': 0.292, 'C': 0.078}, '2020-12-23': {'B': 0.367, 'C': 0.489}, '2020-12-24': {'A': 0.363, 'B': 0.396, 'C': 0.095}, '2020-12-25': {'B': 0.484}}
d=df.to_dict(orient='records')
res={i['Date']:{k:float(i[k]),如果k!='Date'和float(i[k])>>打印(res)
{'2020-12-22':{'A':0.065,'B':0.292,'C':0.078},'2020-12-23':{'B':0.367,'C':0.489},'2020-12-24':{'A':0.363,'B':0.396,'C':0.095},'2020-12-25':{'B':0.484}
如果要使用循环构造结果,可以执行以下操作:

d=df.to_dict(orient='records')

for i in d:
    temp={}
    for k in i:
        if k!='Date' and float(i[k])<0.5:
            temp[k]=float(i[k])
    res[i['Date']]=temp

>>>print(res)
    
{'2020-12-22': {'A': 0.065, 'B': 0.292, 'C': 0.078}, '2020-12-23': {'B': 0.367, 'C': 0.489}, '2020-12-24': {'A': 0.363, 'B': 0.396, 'C': 0.095}, '2020-12-25': {'B': 0.484}}
d=df.to_dict(orient='records')
对于d中的i:
温度={}
对于i中的k:
如果k!='Date'和float(i[k])>>打印(res)
{'2020-12-22':{'A':0.065,'B':0.292,'C':0.078},'2020-12-23':{'B':0.367,'C':0.489},'2020-12-24':{'A':0.363,'B':0.396,'C':0.095},'2020-12-25':{'B':0.484}

试试下面的方法。我知道res=…行不像大多数dict理解那样可读性很差,但它更简洁。如果你需要一个更可编辑的解决方案,只需几个循环就可以轻松完成

d=df.to_dict(orient='records')

res={i['Date']:{k:float(i[k]) for k in i if k!='Date' and float(i[k])<0.5} for i in d}

>>>print(res)

{'2020-12-22': {'A': 0.065, 'B': 0.292, 'C': 0.078}, '2020-12-23': {'B': 0.367, 'C': 0.489}, '2020-12-24': {'A': 0.363, 'B': 0.396, 'C': 0.095}, '2020-12-25': {'B': 0.484}}
d=df.to_dict(orient='records')
res={i['Date']:{k:float(i[k]),如果k!='Date'和float(i[k])>>打印(res)
{'2020-12-22':{'A':0.065,'B':0.292,'C':0.078},'2020-12-23':{'B':0.367,'C':0.489},'2020-12-24':{'A':0.363,'B':0.396,'C':0.095},'2020-12-25':{'B':0.484}
如果要使用循环构造结果,可以执行以下操作:

d=df.to_dict(orient='records')

for i in d:
    temp={}
    for k in i:
        if k!='Date' and float(i[k])<0.5:
            temp[k]=float(i[k])
    res[i['Date']]=temp

>>>print(res)
    
{'2020-12-22': {'A': 0.065, 'B': 0.292, 'C': 0.078}, '2020-12-23': {'B': 0.367, 'C': 0.489}, '2020-12-24': {'A': 0.363, 'B': 0.396, 'C': 0.095}, '2020-12-25': {'B': 0.484}}
d=df.to_dict(orient='records')
对于d中的i:
温度={}
对于i中的k:
如果k!='Date'和float(i[k])>>打印(res)
{'2020-12-22':{'A':0.065,'B':0.292,'C':0.078},'2020-12-23':{'B':0.367,'C':0.489},'2020-12-24':{'A':0.363,'B':0.396,'C':0.095},'2020-12-25':{'B':0.484}

如果我理解正确,您可以使用生成结果并使用字典进行筛选:

import pprint

# set Date as index
n_df = df.set_index('Date').astype(float)

# use to_dict('index')
res = {k: {ki: vi for ki, vi in d.items() if vi < 0.5} for k, d in n_df.to_dict('index').items()}

pprint.pprint(res)

如果我理解正确,您可以使用生成结果并使用字典进行筛选:

import pprint

# set Date as index
n_df = df.set_index('Date').astype(float)

# use to_dict('index')
res = {k: {ki: vi for ki, vi in d.items() if vi < 0.5} for k, d in n_df.to_dict('index').items()}

pprint.pprint(res)

仅供参考,图片和代码的dfs不可用match@IoaTzimas:谢谢你指出。我已经更正了所有图片。图片和代码的dfs不正确match@IoaTzimas:谢谢你指出。我已经更正了所有图像。这可以通过简单for循环实现吗?这可以通过简单for循环实现吗?这可以吗可以通过简单的for循环实现吗?下面使用for循环的解决方案似乎没有添加键,而是覆盖了它。res={}for i in d:for k in i:if k!=“Date”和float(i[k])Hi@PrateekDaniels我在我最初的回答下添加了一个使用循环的解决方案,这可以通过简单的for循环实现吗?下面使用for循环的解决方案似乎没有添加键,而是重写了它。res={}for i in d:for k in i:if k!=“Date”和float(i[k])Hi@PrateekDaniels我在最初的答案下添加了一个使用循环的解决方案