2016-05-19 2 views
1

Я следующие панды ДФ:Исключить столбцы из панд где()

import pandas as pd 
import numpy as np  

pd_df = pd.DataFrame({'Qu1': ['apple', 'potato', 'cheese', 'banana', 'cheese', 'banana', 'cheese', 'potato', 'egg'], 
       'Qu2': ['sausage', 'banana', 'apple', 'apple', 'apple', np.nan, 'banana', 'banana', 'banana'], 
       'Qu3': ['apple', 'potato', 'sausage', 'cheese', 'cheese', 'potato', 'cheese', 'potato', 'egg']}) 

Я хотел бы реализовать where() на двух колонках только Qu1 и Qu2 и держать остальное original stackoverflow question , поэтому я создал pd1

pd1 = pd_df.where(pd_df.apply(lambda x: x.map(x.value_counts()))>=2, 
           "other")[['Qu1', 'Qu2']] 

Затем я добавил остальные pd_df, pd_df['Qu3'] в pd1

pd1['Qu3'] = pd_df['Qu3'] 
pd_df = [] 

Мой вопрос: Первоначально я хочу, чтобы выполнить where() на части df и сохранить остальную часть колонн, как есть, так что может вышеприведенный код быть опасным для большого набора данных? Могу ли я вредить исходным данным таким образом? Если да, то какой лучший способ это сделать?

Большое спасибо!

ответ

1

Вы можете просто явно взять copy в ориг ЦФА и затем перезаписать на выбор этого ДФА:

In [40]: 
pd1 = pd_df.copy() 
pd1[['Qu1', 'Qu2']] = pd1[['Qu1', 'Qu2']].where(pd_df.apply(lambda x: x.map(x.value_counts()))>=2, 
           "other") 
pd1 

Out[40]: 
     Qu1  Qu2  Qu3 
0 other other apple 
1 potato banana potato 
2 cheese apple sausage 
3 banana apple cheese 
4 cheese apple cheese 
5 banana other potato 
6 cheese banana cheese 
7 potato banana potato 
8 other banana  egg 

Таким образом, разница в том, что мы работаем только на участке ФРА, а не все ДФ, а затем выберите COLS интереса

обновление

Если вы хотите просто переписать эти COLS затем просто выбрать те из них:

In [48]: 
pd_df[['Qu1', 'Qu2']] = pd_df[['Qu1', 'Qu2']].where(pd_df.apply(lambda x: x.map(x.value_counts()))>=2, 
           "other") 
pd_df 

Out[48]: 
     Qu1  Qu2  Qu3 
0 other other apple 
1 potato banana potato 
2 cheese apple sausage 
3 banana apple cheese 
4 cheese apple cheese 
5 banana other potato 
6 cheese banana cheese 
7 potato banana potato 
8 other banana  egg 
+0

Спасибо! Мой набор данных составляет приблизительно 30G, будет ли «копировать» производить еще 30G-набор данных в памяти? – Toren

+0

Ваш вопрос показал, что вы создаете копию 2 столбцов, если вы просто хотите перезаписать эти столбцы в оригинале, тогда вы можете просто удалить строку 'copy' и сделать вторую строку на исходном df – EdChum

Смежные вопросы