熊猫正在打印比预期更多的行

时间:2019-04-02 08:13:00

标签: python pandas dataframe

当前,我在数据库上工作,我尝试用熊猫对行进行排序。我有一列称为“ sessionkey”的会话。因此,每一行都可以分配给一个会话。我试图将数据分成这些会话。

此外,可能存在重复的行。我试图用pandas的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())

我以为这可以正常工作,但是当我尝试通过打印分割后的数据帧来检查结果时,输出对我来说很奇怪。例如,我打印了说38行x 4列的数据框的长度。但是,当我打印相同的数据框时,显然有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个条目。然后,熊猫向我返回了第一个1-37个条目,然后追加了2-38个条目。所以最后一个遗漏了,然后整个列表被移动并再次打印。

当我返回numpy值时,只有38个不同的行。那么这是熊猫打印功能的问题吗?我的代码中有错误吗?大熊猫的索引不唯一吗?

编辑:

好的,我知道了问题所在。我想看一个长的数据框,所以我使用了:

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

我认为我的数据框形状错误,但事实并非如此。 因此,中间的事件被打印了两倍。这是错误还是预期的输出?

3 个答案:

答案 0 :(得分:0)

因此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())

答案 1 :(得分:0)

听起来您想根据索引来drop_duplicates-默认情况下,drop_duplicates根据列值进行删除。为此,请尝试

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

这应该只选择重复的索引值

答案 2 :(得分:0)

我用了您的示例代码。

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”设置。 doc states that "None" will set max rows to unlimited。我不确定在将正整数或无作为可接受值的参数中“ -1”将做什么。

尝试

pd.set_option('display.max_rows', None)