我有一个关键列的系列,它按时间顺序包含日期(DateTime Index),以及一个包含数组的值列。我想保留顺序并删除出现在前一行数组中的每个行数组中的各个元素。
数据:
Created
2015-02-08 [X, Y, Z, A]
2015-02-15 [A, B]
2015-02-22 [nan]
2015-03-01 [C]
2015-03-08 [W, F, X, A]
2015-03-15 [Q]
由此,我想得到:
Created
2015-02-08 [X, Y, Z, A]
2015-02-15 [B]
2015-02-22 [nan]
2015-03-01 [C]
2015-03-08 [W, F]
2015-03-15 [Q]
答案 0 :(得分:1)
最简单的方法是维护一个公共列表。对于一行中的每个元素,检查它是否已经存在于公共列表中,它不会将它添加到该特定行的公共列表和输出中,否则只是忽略它。
答案 1 :(得分:1)
您可以从Series
开始apply
lists
,然后在第一级创建stack
,drop_duplicates
和最后groupby
的列。 MultiIndex
和apply
函数tolist()
:
df = pd.DataFrame({'created':[['X','Y','Z', 'A'],
['A','B'],
['nan'],
['C'],
['W','F','X','A'],
['Q']]},
index=["2015-02-08","2015-02-15","2015-02-22",
"2015-03-01","2015-03-08","2015-03-15"])
print df
created
2015-02-08 [X, Y, Z, A]
2015-02-15 [A, B]
2015-02-22 [nan]
2015-03-01 [C]
2015-03-08 [W, F, X, A]
2015-03-15 [Q]
df = df['created'].apply(pd.Series).stack().drop_duplicates()
print df
2015-02-08 0 X
1 Y
2 Z
3 A
2015-02-15 1 B
2015-02-22 0 nan
2015-03-01 0 C
2015-03-08 0 W
1 F
2015-03-15 0 Q
dtype: object
print df.groupby(level=0).apply(lambda x: x.tolist())
2015-02-08 [X, Y, Z, A]
2015-02-15 [B]
2015-02-22 [nan]
2015-03-01 [C]
2015-03-08 [W, F]
2015-03-15 [Q]
dtype: object
如果您需要DataFrame
:
print pd.DataFrame(df.groupby(level=0).apply(lambda x: x.tolist()), columns=['created'])
created
2015-02-08 [X, Y, Z, A]
2015-02-15 [B]
2015-02-22 [nan]
2015-03-01 [C]
2015-03-08 [W, F]
2015-03-15 [Q]