我有下面的熊猫数据框架。在这里,field1,field2...are总是变量,而col1、col2 ....coln大多是常量,并且很少变化。最后,我把它保存在format.parquet内部优化复制,这不是一个问题。
我还有另一个要求将它从parquet.The转换为csv文件大小正在上升。所以我想在把它保存在地板上之前先去掉复本。通过代码这样做会增加时间,因为可以有70-100个这样的列。
date field1 field2 col1 col2 col3 col5
20200508062904.8340+0530 11 22 2 3 3 4
20200508062904.8340+0530 12 23 2 3 3 4
20200508062904.8340+0530 13 22 2 3 3 4
20200508062904.8340+0530 14 24 2 3 3 4
20200508051804.8340+0530 14 24 2 3 3 5
20200508051804.8340+0530 14 24 2 4 3 4
20200508051804.8340+0530 14 24 2 3 3 4对于列(col1 col2 col3 col5),我希望保留初始值并删除重复的重复值。如果这些列在以后的某个时间点具有与初始值不同的值,数据帧应该保持it.Initial值是相对的,并且等于以前的最新值。
预期输出
date field1 field2 col1 col2 col3 col5
20200508062904.8340+0530 11 22 2 3 3 4
20200508062904.8340+0530 12 23
20200508062904.8340+0530 13 22
20200508062904.8340+0530 14 24
20200508051804.8340+0530 14 24 5
20200508051804.8340+0530 14 24 4 4
20200508051804.8340+0530 14 24 3 drop_duplicates帮助删除行,在这种情况下它是无用的。在熊猫身上有什么更好的方法来达到这个目的吗?
发布于 2020-07-23 18:01:13
创建一个掩码,检查列是否等于自身移动,然后填充缺失的值。
cols = [x for x in df.columns if x.startswith('col')]
#@AndyL. points out this equivalent mask is far simpler
m = df[cols].ne(df[cols].shift())
df[cols] = df[cols].astype('O').where(m).fillna('') date field1 field2 col1 col2 col3 col5
0 20200508062904.8340+0530 11 22 2 3 3 4
1 20200508062904.8340+0530 12 23
2 20200508062904.8340+0530 13 22
3 20200508062904.8340+0530 14 24
4 20200508051804.8340+0530 14 24 5
5 20200508051804.8340+0530 14 24 4 4
6 20200508051804.8340+0530 14 24 3 以前使用过不必要的复杂掩码:
m = ~df[cols].ne(df[cols].shift()).cumsum().apply(pd.Series.duplicated)发布于 2020-07-23 17:59:51
您可以使用.where和.shift使连续的值为空,并对每一列执行此操作。如果您有许多列,那么您可以在一个循环中执行下面的操作,就像@ALollz在他的回答中所做的那样。
df['col1'] = df['col1'].where(df['col1'] != df['col1'].shift(), '')带循环的完整代码:
for col in df.columns:
if 'col' in col:
df[col] = df[col].where(df[col] != df[col].shift(), '')产出:
date field1 field2 col1 col2 col3 col5
0 20200508062904.8340+0530 11 22 2 3 3 4
1 20200508062904.8340+0530 12 23
2 20200508062904.8340+0530 13 22
3 20200508062904.8340+0530 14 24
4 20200508051804.8340+0530 14 24 5
5 20200508051804.8340+0530 14 24 4 4
6 20200508051804.8340+0530 14 24 3 发布于 2020-07-23 19:01:24
您可以尝试使用可调用的diff和where以及fillna、replace和update返回到原始df。
cols = ['col1', 'col2', 'col3', 'col5']
df.update(df[cols].diff().eq(0).where(lambda x: x)
.replace(1,'').fillna(df[cols]))
Out[315]:
date field1 field2 col1 col2 col3 col5
0 20200508062904.8340+0530 11 22 2 3 3 4
1 20200508062904.8340+0530 12 23
2 20200508062904.8340+0530 13 22
3 20200508062904.8340+0530 14 24
4 20200508051804.8340+0530 14 24 5
5 20200508051804.8340+0530 14 24 4 4
6 20200508051804.8340+0530 14 24 3https://stackoverflow.com/questions/63060287
复制相似问题