Python vs Stata при подготовке данных - PullRequest
0 голосов
/ 25 мая 2020

Я понимаю, что это маловероятно, но я не могу понять, почему Python выводит немного другой набор данных после простых манипуляций, которые, как мне кажется, идентичны тем, что я делаю в Stata. Итак, Stata:

use "filename", clear  
drop if varname < 1500  
sum  

STATA (необработанные данные)

Obs: 610
Среднее значение: 1339,482
Стандартное: 17,27477
Мин .: 1304
макс: 1368

Проверка на отсутствие (mdesc varname)

Отсутствует: 10953
Итого: 11563
Процент отсутствия: 94,72

STATA (после drop if varname < 1500) :

varname | obs : 389 mean : 1350,599 Std.Dev. : 9,564949 Min: 1333 Макс: 1368
Тип: float

Между тем, Python:

import pandas as pd  
df = pd.read_stata("filename.dta", convert_missing = False)  
df = df[df.varname<1500]  
df.describe()  

PYTHON ( сырые данные: df=pd.read_stata("filename.dta")) : varname
Количество: 610
Среднее: 1339.481934
Стандартное: 17.274755
Мин .: 1304.000000
25%: 1326.000000
50%: 1341.000000
75%: 1353.000000
max: 1368.000000

df.isnull().sum()
varname 10953
Таким образом, количество пропусков в необработанных данных одинаково в Stata и Python, но после удаления Я получаю два разных набора данных.

PYTHON, после df = df[df.varname<1500] ##

Количество: 288,000000
Среднее значение: 1325,7603 76
Станд .: 13.369122
Мин .: 1304.000000
25%: 1316.000000
50%: 1325.000000
75%: 1332.000000
Макс: 1365.000000

В частности, различия в количестве наблюдений. Для некоторых переменных существует шаблонная разница, например, Stata: 11 342 наблюдений, Python: 5064 наблюдений (вдвое меньше). Для некоторых переменных разница не шаблонная, а просто разные значения. Итоговая статистика не слишком разная, но разная. Я новичок в Python, не могли бы вы поделиться, действительно ли это возможно, что он работает с данными иначе, чем Stata?

Правка:

Я понял, что уронил неправильно, вместо df = df[df.varname<1500] надо было набрать df_new = df.drop(df[df.varname< 1500].index). Я не знаю разницы, но теперь у меня есть набор данных, который мне нужен. Спасибо всем за то, что провели здесь время!

1 Ответ

2 голосов
/ 25 мая 2020

Я полагаю, вы неверно истолковали поведение логической операции внутри предложения df[].

В pandas оператор внутри df[statement] должен быть True, чтобы его можно было выбрать.

В вашем примере df = df[df.varname<1500] вернет True для df.varname<1500. Таким образом, вы получите эти строки, удовлетворяющие df.varname<1500, вместо того, чтобы отбрасывать их.

...