首页 > 解决方案 > 如果存在数据框列值,则读取字典中的文件并返回文件值

问题描述

我有一个名为 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)

标签: pythonpandasdictionary

解决方案


您可以尝试使用此示例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)

推荐阅读