В Python, как получить строки из фрейма данных, где конкретная строка присутствует в любом столбце (значение String)

Если вы пытаетесь использовать код ниже:

git reflog show
# head to recover to
git reset HEAD@{1} 

и по какой-то причине получают:

error: неизвестный переключатель `e '

, затем попробуйте обернуть HEAD@{1} в кавычки

git reset 'HEAD@{1}'
2
задан Shara 5 March 2019 в 05:21
поделиться

5 ответов

Быстрое сравнение данных ответов на 20 тысяч строк данных-

@Alollz (в комментариях)

%timeit df.loc[df.filter(like='Task').applymap(lambda x: 'Drafting' in x).any(1)]
25.2 ms ± 2.09 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

@Sergey Bushmanov

%timeit df[df.Task1.str.contains("Drafting") | df.Task2.str.contains("Drafting") | df.Task3.str.contains("Drafting")]
58.7 ms ± 9.25 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

@ anky_91

%timeit df[df.filter(like='Task').apply(lambda x: x.str.contains('Drafting')).any(axis=1)]
88.6 ms ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df[df.astype(str).apply(lambda x: x.str.contains('Drafting')).any(axis=1)]
128 ms ± 14.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

@ALollz

%timeit  df.loc[df.filter(like='Task').stack().str.split(expand=True).eq('Drafting').any(1).any(level=0)]
290 ms ± 29.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
0
ответ дан meW 5 March 2019 в 05:21
поделиться

Или просто (обратите внимание, что здесь будут проверяться все df, а не конкретные столбцы):

df[df.astype(str).apply(lambda x: x.str.contains('Drafting')).any(axis=1)]
#for case insensitive use below
#df[df.astype(str).apply(lambda x: x.str.contains('Drafting',case=False)).any(axis=1)]

  Name  Age              Task1    Task2            Task3
0  Ann   43  Drafting a Letter  sending           paking
1  Juh   29            sending   paking  Letter Drafting
3  Sam   59            sending  pasting  Letter Drafting
0
ответ дан anky_91 5 March 2019 в 05:21
поделиться

Вы можете попробовать что-то вроде этого,

new_df = df[(df['Task1'] == 'Drafting') | (df['Task2'] == 'Drafting') | (df['Task3'] == 'Drafting')]

. Это позволит выбрать все строки, если столбцы Task1 или Task2 или Task3 содержат «Чертеж».

0
ответ дан bumblebee 5 March 2019 в 05:21
поделиться

Вы можете попробовать:

new_df = df[df.Task1.str.contains("Drafting") | df.Task2.str.contains("Drafting") | df.Task3.str.contains("Drafting")]

Это вернет new_df со строками, содержащими «Чертеж» в любом из столбцов «Задача 1,2,3».

0
ответ дан Sergey Bushmanov 5 March 2019 в 05:21
поделиться

Это может быть достигнуто с помощью np.where:

df = pd.DataFrame({
    'Name': ['Ann', 'Juh', 'Jeo', 'Sam'],
    'Age': [43,29,42,59],
    'Task1': ['Drafting a letter', 'Sending', 'Pasting', 'Sending'],
    'Task2': ['Sending', 'Paking', 'Sending', 'Pasting'],
    'Task3': ['Packing', 'Letter Drafting', 'Paking', 'Letter Drafting']
    })

df_new = df.iloc[df.index[np.concatenate(
                np.where(df['Task1'].str.contains('Drafting')) +
                np.where(df['Task2'].str.contains('Drafting')) +
                np.where(df['Task3'].str.contains('Drafting'))).astype(int)
            ].values.tolist()]

print(df_new)

  Name  Age              Task1    Task2            Task3
0  Ann   43  Drafting a letter  Sending          Packing
1  Juh   29            Sending   Paking  Letter Drafting
3  Sam   59            Sending  Pasting  Letter Drafting
0
ответ дан heena bawa 5 March 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: