【问题标题】:Search key and get value in dictionary - Python在字典中搜索键并获取值 - Python
【发布时间】:2022-06-19 02:23:11
【问题描述】:

我正在尝试将我保存在列表“root”中的值与字典中的键匹配,这样我就可以获得这些值。但我不知道该怎么做。 :/也许有人对我有一些启发。非常感谢!

因此我创建了一本字典。

from turtle import clear
import pandas as pd 

df=pd.read_excel(r'path').fillna("@Null$tring").sort_values(by=['VP'])

SP = df['SP'].tolist()
VP = df['VP'].tolist()
root = []

#sSP = set(SP)
#sVP = set(VP)

root = [i for i in SP if i not in VP]

#index =root.index

print(root)
#print(index(root))

d = dict (zip(SP,VP))

for key in d.keys():
    if key == root[0]:
        print(key)

【问题讨论】:

  • 查看difference方法
  • 所以您需要从字典d 创建一个值列表,其中键是列表root 的项目?如果是这样,[d[key] for key in root] 将完成这项工作。
  • 嗨,我更新了我的问题的解释。我在列表中有值,我需要知道这些值是否作为字典中的键,以便我可以获得各自的值

标签: python


【解决方案1】:

如果我正确理解了您要执行的操作,您应该能够充分利用 pandas.Index.differencepandas.Series.isin

这是一个带有一些示例数据的示例:

import pandas as pd

# Sample data.
df1 = pd.DataFrame({
    "AP" : ["foobar", "foo",  "bar",  "baz",  "foobar"],
    "SP" : ["qux",    "spam", "qux",  "ham",  "qux"],
    "VP" : ["spam",   "ham",  "spam", "eggs", "eggs"]
})

# Identifies values in SP not present in VP.
root = pd.Index(df1["SP"]).difference(pd.Index(df1["VP"]))

# Masks out data where the value of SP is not present in root,
# then selects only the SP and VP columns from the resulting
# DataFrame and resets the index. 
df2 = df1[df1["SP"].isin(root)][["SP", "VP"]].reset_index(drop = True)

在给定示例数据的情况下,引导您完成每个步骤,就输出而言:

>>> df1
       AP    SP    VP
0  foobar   qux  spam
1     foo  spam   ham
2     bar   qux  spam
3     baz   ham  eggs
4  foobar   qux  eggs

root 被视为df1["SP"]df1["VP"] 之间的差异转换为pandas.Index 对象:

>>> pd.Index(df1["SP"])
Index(['qux', 'spam', 'qux', 'ham', 'qux'], dtype='object', name='SP')

>>> pd.Index(df1["VP"])
Index(['spam', 'ham', 'spam', 'eggs', 'eggs'], dtype='object', name='VP')

>>> pd.Index(df1["SP"]).difference(pd.Index(df1["VP"]))
Index(['qux'], dtype='object')

然后我们检查root 中存在哪些df["SP"] 值,并使用生成的布尔值pandas.Series 作为pandas.DataFrame 的掩码:

>>> df1["SP"].isin(root)
0     True
1    False
2     True
3    False
4     True
Name: SP, dtype: bool

>>> df1[df1["SP"].isin(root)]
       AP   SP    VP
0  foobar  qux  spam
2     bar  qux  spam
4  foobar  qux  eggs

最后,我们可以只索引我们感兴趣的两列并重置索引:

>>> df1[df1["SP"].isin(root)][["SP", "VP"]].reset_index(drop = True)
    SP    VP
0  qux  spam
1  qux  spam
2  qux  eggs

【讨论】:

  • 感谢这个解释性很好的例子,这对我理解熊猫的一些方法和工作方式有很大帮助。我还有一个问题。数据集包含 SP 中的各种重复项,因此我收到错误 reindexing with a non-unique Index is deprecated and will raise in a future version.。有什么办法可以解决这个问题吗?我不想删除重复项,因为我需要稍后计算它们。
  • 啊,明白了。我刚刚编辑了我的答案,使其更笼统。它现在应该能够处理 SP 的重复值,并且我已经修改了示例数据以反映这一点。如果效果更好,请告诉我。
【解决方案2】:

(我没有足够的声誉发表评论,所以我将我的评论作为答案发布,为此道歉)您的 for 循环仅匹配列表中第一个元素的键。也许这可以帮助你? (我修正了我的缩进和 while 循环对此感到抱歉)

i = 0
while i <= len(d.keys()):
  
  for key in d.keys():
      if key == root[i]:
         print(key)
      i = i + 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多