在csv文件Python中查找特定值

时间:2019-05-10 17:34:11

标签: python pandas csv

我有一列值,它们是数据帧df的一部分。

Value 
6.868061881
6.5903628020000005
6.472865833999999
6.427754219
6.40081742
6.336348032
6.277545389
6.250755132

这些值是从几个CSV文件中汇总而成的。现在,我试图回溯并找到包含值的原始CSV文件。这是我的代码。问题是CSV文件的每一行都包含字母数字条目,而我只比较数字条目(如上述“值”)。因此代码无法正常工作。

for item in df['Value']:
    for file in dirs:
        csv_file = csv.reader(open(file))
        for row in csv_file:
            for column in row:
                if str(column) == str(item):
                    print (file)

此外,我正在尝试优化#个循环。我该如何处理?

3 个答案:

答案 0 :(得分:3)

假设dirs是CSV文件的文件路径的列表:

csv_dfs = {file: pd.read_csv(file) for file in dirs}
csv_df = pd.concat(csv_dfs)

如果您只是在'Values'列中查找,这很简单:

print csv_df[csv_df['Values'].isin(df['Values'])]

因为我们是从文件的字典制作数据帧的,其中的键是文件名,所以打印的值将在索引中具有原始文件名。


在评论中,您询问了如何获取文件名。由于我们构造数据框的索引的方式,以下应该可以获取一系列文件名:

csv_df[csv_df['Values'].isin(df['Values'])].reset_index()['level_0']

请注意,如果您不确定要匹配的CSV中的哪一列,则可以对其进行循环:

for col in df.columns:
    print csv_df[csv_df[col].isin(df['Values'])]

答案 1 :(得分:0)

一些建议:

确保您要比较类似的类型,例如:

if str(column) == str(item):

或者,您可以在进行比较之前检查类型:

if all(map(type,[column,item])) and column == item: 

或者,将CSV转储到DataFrame中。这种方法减少了循环次数,因为您无需遍历file中的行/行,只需遍历各列即可:

from pandas import read_csv

for item in df['Value']:
    for file in dirs:
        csv_frame = read_csv(file)
        for column in csv_frame.columns:
            if item in csv_frame[column]:
               print(file)

答案 2 :(得分:0)

文件I / O通常比处理内存中的数据要花费更多时间。因此,如果您想优化代码,最好遍历csv文件一次,而不是遍历数据框中的每个项目。我建议以下内容-

val_list = df['Values'].values
for file in dirs:
    csv_df = pd.read_csv(file)
    df_contains = csv_df.isin(val_list)
    if np.any(df_contains.values):
        print(file)