目前我在一个数据库上工作,我试着用pandas对我的行进行排序。我有一个名为'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列。但是,当我打印相同的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个条目。因此,最后一个被省略,然后整个列表被移位并再次打印。
当我返回numpy值时,只有38个不同的行。那么这是pandas的打印功能的问题吗?我的代码中有错误吗?pandas在非唯一索引方面有问题吗?
编辑:
好了,我知道问题出在哪里了。我想看一个很长的数据帧,所以我使用:
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有错误的形状,但事实并非如此。所以中间的事件会被打印成两倍。这是一个bug还是一个可疑的输出?
发布于 2019-04-02 16:33:29
因此,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())发布于 2019-04-02 16:39:53
这听起来像是您想要基于索引进行drop_duplicates -默认情况下,drop_duplicates根据列值删除。要做到这一点,请尝试
df.loc[~df.index.duplicated()]
这应该只选择不重复的索引值
发布于 2019-04-03 14:52:13
我使用了你的示例代码。
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“在接受正整数或None作为可接受值的参数中会做什么。
试一试
pd.set_option('display.max_rows', None)https://stackoverflow.com/questions/55469888
复制相似问题