当前,我在数据库上工作,我尝试用熊猫对行进行排序。我有一列称为“ 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
我认为我的数据框形状错误,但事实并非如此。 因此,中间的事件被打印了两倍。这是错误还是预期的输出?
答案 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)