Панды печатает больше строк, чем ожидалось - PullRequest
2 голосов
/ 02 апреля 2019

В настоящее время я работаю с базой данных и пытаюсь отсортировать строки с помощью панд. У меня есть столбец с именем 'sessionkey', который относится к сеансу. Таким образом, каждая строка может быть назначена для сеанса. Я пытался разделить данные на эти сессии.

Кроме того, могут быть дублированные строки. Я пытался удалить их с помощью функции drop_duplicates из панд.

df = pd.read_csv((path_of_data+'part-00000-9d3e32a7-87f8-4218-bed1-e30855ce6f0c-c000.csv'), keep_default_na=False, engine='python')
tmp = df['sessionkey'].values #I want to split data into different sessions
tmp = np.unique(tmp)


df.set_index('sessionkey', inplace=True)
watching = df.loc[tmp[10]].drop_duplicates(keep='first') #here I pick one example
print(watching.sort_values(by =['eventTimestamp', 'eventClickSequenz']))
print(watching.info())

Я бы подумал, что это работает нормально, но когда я попытался проверить свои результаты, распечатав свой разделенный фрейм данных, вывод мне показался очень странным. Например, я напечатал длину Dataframe, это говорит о 38 строках x 4 столбцах. Но когда я печатаю тот же самый Dataframe, там явно больше 38 строк, и в нем все еще есть дубликаты.

Я уже пытался разделить данные, используя уникальные индексы:

comparison = pd.DataFrame()

for index, item in enumerate(df['sessionkey'].values):
    if item==tmp: comparison = comparison.append(df.iloc[index])

comparison.drop_duplicates(keep='first', inplace=True)
print(comparison.sort_values( by = ['eventTimestamp']))

Но проблема все та же.

Выходные данные также соответствуют шаблону. Допустим, у нас есть 38 записей. Затем pandas возвращает мне первые 1-37 записей, а затем добавляет 2-38 записей. Таким образом, последний исключается, а затем весь список перемещается и печатается снова.

Когда я возвращаю числовые значения, есть только 38 разных строк. Так это проблема функции печати из панд? Есть ли ошибка в моем коде? Есть ли у панд проблемы с неуникальными индексами?

EDIT:

Хорошо, я понял, в чем проблема. Я хотел посмотреть на длинный фрейм данных, поэтому я использовал:

pd.set_option('display.max_rows', -1)

Теперь мы можем использовать некоторые примеры данных:

data = np.array([[119, 0], [119, 1], [119, 2]])
columns = ['sessionkey', 'event']
df = pd.DataFrame(data, columns = columns)
print(df)

Напечатано, теперь это выглядит так:

    sessionkey  event
0          119      0
1          119      1
1          119      1
2          119      2

Хотя я ожидал, что это будет выглядеть так:

   sessionkey  event
0         119      0
1         119      1
2         119      2

Я думал, что мой Dataframe имеет неправильную форму, но это не так. Таким образом, событие в середине печатается вдвое. Это ошибка или вывод с намерением?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Похоже, вы хотите drop_duplicates на основе индекса - по умолчанию drop_duplicates падает на основе значений столбца. Для этого попробуйте

df.loc[~df.index.duplicated()]

При этом должны выбираться только те значения индекса, которые не продублированы

0 голосов
/ 03 апреля 2019

Я использовал ваш пример кода.

data = np.array([[119, 0], [119, 1], [119, 2]])
columns = ['sessionkey', 'event']
df = pd.DataFrame(data, columns = columns)
print(df)

И я получил ожидаемый результат.

   sessionkey  event
0         119      0
1         119      1
2         119      2

После того, как я установил опцию max_rows, как вы сделали:

pd.set_option('display.max_rows', -1)

Я получил неверный результат.

    sessionkey  event
0          119      0
1          119      1
1          119      1
2          119      2

Возможно, проблема в настройке «-1». Документ гласит, что "None" установит максимальное количество строк равным . Я не уверен, что «-1» будет делать в параметре, который принимает положительные целые числа или None в качестве допустимых значений.

Попробуйте

pd.set_option('display.max_rows', None)
0 голосов
/ 02 апреля 2019

поэтому drop_duplicates() не смотрит на индекс при избавлении от строк, вместо этого он смотрит на всю строку.Но у него есть полезный subset kwarg, который позволяет вам указать, какие строки использовать.

Вы можете попробовать следующее

df = pd.read_csv((path_of_data+'part-00000-9d3e32a7-87f8-4218-bed1-e30855ce6f0c-c000.csv'), keep_default_na=False, engine='python')

print(df.shape)
print(df["session"].nunique()) # number of unique sessions


df_unique = df.drop_duplicates(subset=["session"],keep='first')

# these two numbers should be the same
print(df_unique.shape)
print(df_unique["session"].nunique())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...