2013-12-16 4 views
0

Существует несогласованность с файлами данных, которые я не могу объяснить. В следующем, я не ищу обходного пути (уже нашел один), но объяснения того, что происходит под капотом и как он объясняет вывод.Нечетные значения Dataframe отличаются от значений value_counts()

Один из моих коллег, с которым я разговаривал с использованием python и pandas, имеет данные данных данных с 12 000 строк. «данные» имеют столбец «длина», который содержит числа от 0 до 20. Она хочет разделить датировку на группы по диапазону длин: от 0 до 9 в группе 1, от 9 до 14 в группе 2, 15 и более в группе 3 ее решение состояло в том, чтобы добавить еще один столбец «группа» и заполнить его соответствующими значениями. она написала следующий код:

data['group'] = np.nan 
mask = data['length'] < 10; 
data['group'][mask] = 1; 
mask2 = (data['length'] > 9) & (data['phraseLength'] < 15); 
data['group'][mask2] = 2; 
mask3 = data['length'] > 14; 
data['group'][mask3] = 3; 

Этот код не является хорошим, конечно. причина в том, что это не хорошо, потому что вы не знаете во время выполнения, например, будет ли вид data['group'][mask3], и, таким образом, фактически изменит фрейм данных, или он будет копией, и, таким образом, dataframe останется неизменным. Мне потребовалось некоторое время, чтобы объяснить это ей, поскольку она правильно утверждала, что выполняет задание, а не выбор, поэтому операция должна всегда возвращать представление.

Но это была не странная часть. часть четная я не мог понять это: После выполнения этого набора операций, мы убедились, что назначение имело место в двух различных направлениях:

  1. Введя data в консоли и рассмотрения резюме dataframe , Он сказал нам, что у нас было несколько тысяч нулевых значений. Число нулевых значений было таким же, как размер mask3, поэтому мы предположили, что последнее присвоение было сделано на копии, а не на представлении.

  2. Набрав data.group.value_counts(). Это вернуло 3 значения: 1,2 и 3 (сюрприз), затем мы набрали data.group.value_counts.sum() и суммировали до 12 000!

Таким образом, по методу 2 столбец группы не содержит нулевых значений и всех значений, которые мы хотели бы иметь. Но по методу 1 - он не сделал!

Может ли это объяснить это?

ответ

0

см. Документы here.

Вы не хотите устанавливать значения таким образом, чтобы точно указать причину, по которой вы указали; поскольку вы не знаете, есть ли у вас представление, вы не знаете, что вы фактически меняете данные. 0,13 поднимут/предупреждают, что вы пытаетесь сделать это, но самый простой/лучше просто получить доступ, как:

data.loc[mask3,'group'] = 3 

, который будет гарантировать вам INPLACE SetItem

+0

Да, но это не то, что я просил. Я сказал в сообщении, что знаю это право (так же, как вы предлагали), что я спрашиваю (и не понимаю), это странное поведение, объясняемое в конце сообщения. Спасибо за ответ, хотя – idoda

+0

может быть связано с ошибкой в ​​0.12. попробуйте 0.13rc1 и посмотрите, повторяются ли они. Это была очень тонкая ошибка обновления кеша (это то, что вы получаете, когда вы обращаетесь к файлу данных, например '' df.column_name', дает серию). Это кешированная серия. – Jeff

+0

может быть связано с: https://github.com/pydata/pandas/issues/5424 – Jeff

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