python - 如果存在数据框列值,则读取字典中的文件并返回文件值
问题描述
我有一个名为 df1 的包含数千行的数据框:
change info level
R6J P123D 1
K4B BNJIA 1
S23P WWGFT 1
Y9O 77-ER 2
L243Z BNJIA 1
M013 22HF 3
和一个以“info”列作为键的字典(有数千个键)。所有以键开头的文件名都是值:
dict = {'P123D':['P123D-334.csv'], 'BNJIA':['BNJIA-32G.csv', 'BNJIA-23A.csv'], 'WWGFT':['WWGFT-0RTF.csv', 'WWGFT-IIJK.csv'], '77-ER':['77ER-LLK.csv'], '22HF':['22HF-HFG76.csv']}
我正在检查 df1['info'] 中的字符串是否与 dict 中的任何键匹配。如果它们匹配,则读取与键值关联的文件,并在 df1['change'] 中与从 df1['info'] 中获取的字符串在同一行中查找字符串。
如果来自 df1['change'] 的字符串在文件中,则从第 3 列获取值并附加到 df1。
文件内容示例:
col1 col2 col3
P34F 5 2.3
R6J 12 3.5
X65D 2 -1.4
期望的输出:显然,如果找到一个值,new_col 的其他行也将是满的
change info level new_col
R6J P123D 1 3.5
K4B BNJIA 1
S23P WWGFT 1
Y9O 77-ER 2
L243Z BNJIA 1
M013 22HF 3
我尝试了一些不同的事情,但似乎无法解决。
lst = []
for k,v in new_dict.items():
if k in df1.iloc[:,2]:
lst.append(df1.iloc[:,0])
for v in new_dict.values():
if v.split('-') in df1.iloc[:,2]:
with open(v, 'r') as f:
for i in lst:
if i in f.read():
print(i)
解决方案
您可以尝试使用此示例new_col
从 dict 和数据框创建:
def custom_func(x, dct):
if x.info in dct:
for v in dct[x.info]:
tmp_df = pd.read_csv(v, sep=r'\s+')
v = tmp_df.loc[tmp_df['col1'] == x.change, 'col3']
if len(v) > 0:
return v.iat[0]
dct = {'P123D':['P123D-334.csv'], 'BNJIA':['BNJIA-32G.csv', 'BNJIA-23A.csv'], 'WWGFT':['WWGFT-0RTF.csv', 'WWGFT-IIJK.csv'], '77-ER':['77ER-LLK.csv'], '22HF':['22HF-HFG76.csv']}
df['new_col'] = df[['change', 'info']].apply(lambda x: custom_func(x, dct), axis=1)
print(df)
推荐阅读
- javascript - 由于登录用户如何编辑表记录
- laravel - 使用 laravel 连接到亚马逊 aws 时出错
- google-maps - 谷歌地图未显示在百里香中
- c# - 迁移到 Swashbuckle.AspNetCore 版本 5 时,Swagger UI 中的不记名身份验证
- amazon-web-services - 指定位置的脚本:以 root 用户身份运行的脚本/stop_server.sh 失败,退出代码为 126
- compiler-construction - 解析没有参数分隔符的函数参数
- python - 停止索引太多
- ms-access - MS 365 访问表单 Dlookup #Name?
- java - 如何在不覆盖其他孩子的情况下添加新孩子
- c# - 过滤 IQueryable 会带回错误的结果