首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas打印的行数比预期的多

Pandas打印的行数比预期的多
EN

Stack Overflow用户
提问于 2019-04-02 16:13:00
回答 3查看 799关注 0票数 3

目前我在一个数据库上工作,我试着用pandas对我的行进行排序。我有一个名为'sessionkey‘的列,它引用了一个会话。因此可以将每一行分配给一个会话。我尝试将数据分离到这些会话中。

此外,还可以有重复的行。我试着从pandas中删除那些带有drop_duplicates函数的代码。

代码语言:javascript
复制
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列。但是,当我打印相同的Dataframe时,显然有超过38行,并且其中仍然有重复的数据。

我已经尝试使用唯一索引来拆分数据:

代码语言:javascript
复制
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个条目。因此,最后一个被省略,然后整个列表被移位并再次打印。

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

编辑:

好了,我知道问题出在哪里了。我想看一个很长的数据帧,所以我使用:

代码语言:javascript
复制
pd.set_option('display.max_rows', -1)

现在我们可以使用一些示例数据:

代码语言:javascript
复制
data = np.array([[119, 0], [119, 1], [119, 2]])
columns = ['sessionkey', 'event']
df = pd.DataFrame(data, columns = columns)
print(df)

打印出来的现在看起来是这样的:

代码语言:javascript
复制
    sessionkey  event
0          119      0
1          119      1
1          119      1
2          119      2

尽管我预计它会是这样的:

代码语言:javascript
复制
   sessionkey  event
0         119      0
1         119      1
2         119      2

我以为我的Dataframe有错误的形状,但事实并非如此。所以中间的事件会被打印成两倍。这是一个bug还是一个可疑的输出?

EN

回答 3

Stack Overflow用户

发布于 2019-04-02 16:33:29

因此,drop_duplicates()在删除行时不会查看索引,而是查看整个行。但它确实有一个有用的subset kwarg,允许您指定要使用的行。

您可以尝试执行以下操作

代码语言:javascript
复制
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())
票数 0
EN

Stack Overflow用户

发布于 2019-04-02 16:39:53

这听起来像是您想要基于索引进行drop_duplicates -默认情况下,drop_duplicates根据列值删除。要做到这一点,请尝试

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-04-03 14:52:13

我使用了你的示例代码。

代码语言:javascript
复制
data = np.array([[119, 0], [119, 1], [119, 2]])
columns = ['sessionkey', 'event']
df = pd.DataFrame(data, columns = columns)
print(df)

我得到了你的预期结果。

代码语言:javascript
复制
   sessionkey  event
0         119      0
1         119      1
2         119      2

在我设置了max_rows选项之后,就像您一样:

代码语言:javascript
复制
pd.set_option('display.max_rows', -1)

我得到了不正确的结果。

代码语言:javascript
复制
    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“在接受正整数或None作为可接受值的参数中会做什么。

试一试

代码语言:javascript
复制
pd.set_option('display.max_rows', None)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55469888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档