Я пытаюсь выбрать все строки, содержащие «--->», но получаю только некоторые из них. Я хотел бы видеть всю строку, если она содержит "--->" в любой "ячейке".

import pandas as pd

df = pd.DataFrame({'A':['1--->3','4','6',''],'B':['2','4','--->8','4'],'C'['5','0','4','2--->']})
print df
print "------------------------------"

st = df[df[df.columns.any()].str.contains("--->", na=False)]

print st

print "------------------------------"

rm = df.loc[df[df.columns.all(0)].str.contains("--->", na=False)]
print rm

rev = df[~df[df.columns.all()].str.contains('^((?!--->).)*$', 
regex=True,na=False)]

print rev

        A      B      C
0  1--->3      2      5
1       4      4      0
2       6  --->8      4
3              4  2--->
------------------------------

St выход

        A  B  C
0  1--->3  2  5
------------------------------

Среднеквадратичный выход

  A  B      C
3    4  2--->

Обороты на выходе A B C 3 4 2 --->

Я ожидаю увидеть

        A      B      C
0  1--->3      2      5
2       6  --->8      4
3              4  2--->
1
Maksim Ark 25 Июн 2019 в 22:35

3 ответа

Лучший ответ

Вам необходимо stack фрейм данных, так что вы можете использовать метод доступа str для суммированных значений. Это дает логическое значение для каждого значения ячейки информационного кадра. unstack, а затем {{ X3}} устанавливает, является ли какой-либо элемент Истиной над строкой.

df[df.stack().str.contains('--->').unstack().any(1)]

Выход:

        A   B       C
0   1--->3  2       5
2   6       --->8   4
3           4       2--->
1
harvpan 25 Июн 2019 в 19:58

Еще один способ сделать это - просто применить функцию с лямбда-выражением.

def only_arrow(row):    
    for r in row:
        if "-->" in r:
            return True
    return False

И примените его к вашему df (это даст вам значения true / false как ряды):

result = df.apply(lambda x : only_arrow(x), axis=1)

0     True
1    False
2     True
3     True

Удалить индексы, где это «Ложь»

df.drop(result[result==False].index, inplace=True)

Результат:

enter image description here

1
adhg 25 Июн 2019 в 20:32

Это похоже на работу

import pandas as pd

df = pd.DataFrame({'A': ['1--->3', '4', '6', ''], 'B': ['2', '4', '--->8', '4'], 'C': ['5', '0', '4', '2--->']})
print(df)
print('~~~~~~~~~~~~~~~~~~~~~~~')
filtered_df = df[(df['A'].str.contains('--->')) | (df['B'].str.contains('--->')) | (df['C'].str.contains('--->'))]
print(filtered_df)

Выход

        A      B      C
0  1--->3      2      5
1       4      4      0
2       6  --->8      4
3              4  2--->
~~~~~~~~~~~~~~~~~~~~~~~
        A      B      C
0  1--->3      2      5
2       6  --->8      4
3              4  2--->
1
balderman 25 Июн 2019 в 19:54