获取具有特定值的单元格在Pandas中的行和列

时间:2018-12-19 17:54:38

标签: excel pandas dataframe

我正在尝试读取未使用Pandas格式化的Excel电子表格。一张纸中有多个表,我想将这些表转换为数据框。由于尚未以传统方式对其进行“索引”,因此没有有意义的列或行索引。有没有一种方法可以搜索特定的值并获取行,列所在的位置?例如,假设我要获取包含字符串“ Title”的所有单元格的行,列号。

我已经尝试过DataFrame.filter之类的东西,但仅在具有行和列索引的情况下才有效。

7 个答案:

答案 0 :(得分:2)

您可以做一些漫长而难以阅读的列表理解:

# assume this df and that we are looking for 'abc'
df = pd.DataFrame({'col':['abc', 'def','wert','abc'], 'col2':['asdf', 'abc', 'sdfg', 'def']})

[(df[col][df[col].eq('abc')].index[i], df.columns.get_loc(col)) for col in df.columns for i in range(len(df[col][df[col].eq('abc')].index))]

退出:

[(0, 0), (3, 0), (1, 1)]

我应该注意,这是(索引值,列位置)

如果您要查找包含某个特定值的任何字符串,也可以将.eq()更改为str.contains()

[(df[col][df[col].str.contains('ab')].index[i], df.columns.get_loc(col)) for col in df.columns for i in range(len(df[col][df[col].str.contains('ab')].index))]

答案 1 :(得分:1)

以下是获取包含单词“ title”的单元格的所有行和列索引的示例-

LOCAL_AIDL_INCLUDES

答案 2 :(得分:1)

您只需调用df == 'title',即可创建与df形状相同的蒙版。 然后,您可以将其与df.where()方法结合使用,该方法会将所有与您的关键字不同的字段设置为NA,最后您可以使用dropna()将其简化为所有有效字段。然后,您可以像平常一样使用df.columnnsdf.index

df = pd.DataFrame({"a": [0,1,2], "b": [0, 9, 7]})
print(df.where(df == 0).dropna().index)
print(df.where(df == 0).dropna().columns)

#Int64Index([0], dtype='int64')
#Index(['a', 'b'], dtype='object')

答案 3 :(得分:1)

使用NaN创建一个df,其中找不到your_value。
删除所有不包含该值的行。
删除所有不包含该值的列

a = df.where(df=='your_value').dropna(how='all').dropna(axis=1)

获取行

a.index

获取列

a.columns  

答案 4 :(得分:0)

类似于Chris所说的,尽管这不是最漂亮或最短的方法,但我发现它对我有用。这将返回与数据框中的正则表达式匹配的所有行,列对:

for row in df.itertuples():
    col_count = 0
    for col in row:
        if regex.match(str(col)):
            tuples.append((row_count, col_count))
            col_count+=1
        row_count+=1

return tuples

答案 5 :(得分:0)

@It_is_Chris解决方案中还包含另一种方法,但可能更容易理解:

# assuming this df and that we are looking for 'abc'
df = pd.DataFrame({'col':['abc', 'def','wert','abc'], 'col2':['asdf', 'abc', 'sdfg', 'def']})
[x[1:] for x in ((v, i, j) for i, row_tup in enumerate(df.itertuples(index=False)) for j, v in enumerate(row_tup)) if x[0] == "abc"]

输出

[(0, 0), (1, 1), (3, 0)]

答案 6 :(得分:0)

如果第二个 dropna 得到 how='all',@firefly 的答案也有效:

a = df.where(targetMap == 'your_value').dropna(how='all').dropna(how='all',axis=1)