Як скинути список рядків із фрейму даних Pandas?


259

У мене є df кадр даних:

>>> df
                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20060630   6.590       NaN      6.590   5.291
       20060930  10.103       NaN     10.103   7.981
       20061231  15.915       NaN     15.915  12.686
       20070331   3.196       NaN      3.196   2.710
       20070630   7.907       NaN      7.907   6.459

Тоді я хочу скинути рядки з певними порядковими номерами, які вказані у списку, припустимо, що тут [1,2,4],залишилося:

                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20061231  15.915       NaN     15.915  12.686
       20070630   7.907       NaN      7.907   6.459

Як або яка функція може це зробити?


просто для уточнення, це питання стосується випадання рядків із конкретними значеннями індексу .. їх використання [1,2,4] означає вказівку на рядки, залишені після випадання. Нижче є відповіді, які роблять це.
алхімія

Відповіді:


387

Використовуйте DataFrame.drop і передайте йому Серію міток індексу:

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2

18
+1 Крім того, викидання останнього ряду df.drop (df.tail (1) .index)
Nasser Al-Wohaibi

15
Ця відповідь працює лише в тому випадку, якщо df.index.unique () збігається з df.index, що не є вимогою для DataFrame Pandas. Хтось має рішення, коли значення df.index не гарантовано є унікальними?
Дж. Джонс

2
це не дозволяє вам індексувати саме ім’я індексу
ingrid

45
На прикладі людей, якщо ви хочете зрозуміти, не використовуйте однакові рядки для рядків і стовпців. Це добре для тих, хто вже справді знає свої речі. Розчарування для тих, хто намагається навчитися.
gseattle

2
новачки python: зауважте, що якщо ви хочете скинути ці рядки та зберегти їх у тому ж кадрі даних (inplace), вам також потрібно додати axis=0(0 = рядки, 1 = стовпці) та inplace=Trueяк у df.drop(df.index[[1,3]], axis=0, inplace=True). @mezzanaccio, якщо ви конкретно знаєте, які індекси ви хочете замінити (а також використовуючи свій приклад від 0 до n):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT

112

Зверніть увагу, що може бути важливо використовувати команду "inplace", коли ви хочете зробити падіння рядка.

df.drop(df.index[[1,3]], inplace=True)

Оскільки ваше первісне запитання нічого не повертає, цю команду слід використовувати. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html


47

Якщо DataFrame величезна, а кількість рядків, які потрібно скинути, також велика, то просте падіння за індексом df.drop(df.index[])забирає занадто багато часу.

У моєму випадку у мене є багатоіндексований DataFrame з плаваючими 100M rows x 3 cols, і мені потрібно видалити 10kз нього рядки. Найшвидший метод, який я знайшов, - досить протизаконно, до takeрешти рядків.

Дозвольте indexes_to_dropзалишити масив позиційних індексів ( [1, 2, 4]у питанні).

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

У моєму випадку це зайняло 20.5s, а прості df.dropзайняли 5min 27sі зайняли багато пам’яті. Отриманий DataFrame такий же.


43

Ви також можете передати DataFrame.drop саму мітку (замість серії міток індексу):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

Що еквівалентно:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

1
df.drop (df.index [0]) також працює. я маю на увазі, немає необхідності в подвійних квадратних дужках (з пандами 0.18.1, принаймні)
тагома

23

Я вирішив це більш простим способом - всього за 2 кроки.

Крок 1: Спершу сформуйте кадр даних із небажаних рядків / даних.

Крок 2: Використовуйте індекс цього небажаного кадру даних, щоб скинути рядки з початкового фрейму даних.

Приклад:

Припустимо, у вас є df-кадр даних, який має стільки ж стовпців, включаючи 'Age', що є цілим числом. Тепер скажімо, що ви хочете опустити всі рядки з "Віком" як від'ємним числом.

Крок 1: df_age_negative = df [df ['Age'] <0]

Крок 2: df = df.drop (df_age_negative.index, вісь = 0)

Сподіваюся, це набагато простіше і допоможе вам.


1
+1, це єдина відповідь, яка говорить про те, як видалити рядок, вибравши стовпець, відмінний від першого.
Алехо Бернардін

10

Якщо я хочу скинути рядок, який має, скажімо, індекс x, я би зробив наступне:

df = df[df.index != x]

Якщо я хочу скинути кілька індексів (скажімо, ці індекси є у списку unwanted_indices), я б зробив:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

Ось трохи конкретний приклад, який я хотів би показати. Скажімо, у вас є багато повторюваних записів у деяких рядах. Якщо у вас є рядкові записи, ви можете легко скористатися рядковими методами, щоб знайти всі індекси для випадання.

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

А тепер киньте ці рядки, використовуючи їх індекси

new_df = df.drop(ind_drop)

3

У коментарі до відповіді @ theodros-zelleke @ j-jones запитав, що робити, якщо індекс не є унікальним. Мені довелося зіткнутися з такою ситуацією. Що я зробив, це перейменувати дублікати в індексі, перш ніж я подзвонив drop(), a la:

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

де rename_duplicates()визначена функція, яка пройшла через елементи індексу та перейменувала дублікати. Я використовував ту саму схему перейменування, що і pd.read_csv()використання у стовпцях, тобто, "%s.%d" % (name, count)де nameназва назви рядка і countскільки разів це відбулося раніше.


1

Визначення індексу від булевого типу, як описано вище, наприклад

df[df['column'].isin(values)].index

може бути більш інтенсивним в пам'яті, ніж визначення індексу за допомогою цього методу

pd.Index(np.where(df['column'].isin(values))[0])

застосовується так

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

Цей метод корисний при роботі з великими рамками даних та обмеженою пам'яттю.


0

Для опускання рядка використовуйте лише аргумент Index:

df.drop(index = 2, inplace = True)

Для кількох рядків: -

df.drop(index=[1,3], inplace = True)

0

Розглянемо приклад фрейму даних

df =     
index    column1
0           00
1           10
2           20
3           30

ми хочемо скинути 2-й та 3-й рядки індексу.

Підхід 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

Підхід 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.