我有一个熊猫DataFrame df
,其中包含文件名列表。
这里是一个示例:
print(df)
>>
+---------+---------+
| ID| Field|
+---------+---------+
| AAA.png| X|
| BBB.jpg| Y|
| CCC.png| Z|
+---------+---------+
我要从给定的ID
(不带扩展名的文件名)中检索列Field
的值。
例如,对于my_id = BBB
,我想获取值Y
。
为此,我尝试了以下操作:
my_id = BBB
field_value = df[df["ID"].str.split('.')[0] == my_id]["Field"]
但是出现错误KeyError: False
。我理解为什么会有这个错误,但是我不知道如何以其他方式做到这一点。
答案 0 :(得分:3)
由boolean indexing
和DataFrame.loc
进行的第一个过滤器-输出为Series
:
field_value = df.loc[df["ID"].str.split('.').str[0] == my_id, "Field"]
然后将第一个值与next
一起使用iter
:
first val = next(iter(field_value), 'no match')
如果需要列表中所有匹配的值:
L = field_value.tolist()
答案 1 :(得分:1)
我用str.contains
测试过:
Task
您可以看到它可以返回多个值。同样,它是my_id="BBB"
field_values = df.loc[df["ID"].str.contains(my_id), "Field"]
print(field_values)
开头的文件名的公告符号,例如.
。
.AAA.png
答案 2 :(得分:0)
使用os.path.splitext
例如:
import os
import pandas as pd
df = pd.DataFrame({"ID": ["AAA.png", "BBB.png", "CCC.png"],
"Field": ["X", "Y", "Z"]})
my_id = "BBB"
mask = df["ID"].apply(os.path.splitext).str[0] == my_id
print(df[mask]["Field"])
输出:
1 Y
Name: Field, dtype: object