我有一个如下数据框:
test = pd.DataFrame({'ID':[4, 5, 6, 6, 6, 7, 7, 7], 'val1':['one', 'one', 'two', 'two', 'three', np.nan, 'seven', 'seven'], 'val2':['hi', 'bye', 'hola', 'hola', 'hola', 'ciao', 'ciao', 'namaste'], 'val3':[3, 3, 4, np.nan, 4, 5, 5, 6]})
test
ID val1 val2 val3
0 4 one hi 3.0
1 5 one bye 3.0
2 6 two hola 4.0
3 6 two hola NaN
4 6 three hola 4.0
5 7 NaN ciao 5.0
6 7 seven ciao 5.0
7 7 seven namaste 6.0
每个ID都有一些测量值,有些ID重复三次。
如果特定列的复制ID之间存在分歧,那么我希望新数据框具有该值的NaN。
如果一个值已经存在一个NaN(考虑不进行测量),但是该重复样本中的另外两个已匹配,那么我希望该一致性出现在最终数据帧中。如果存在值的两者之间存在分歧,则为NaN。
我当时在考虑使用pandas groupby然后进行聚合,但是我不确定如何对聚合函数进行逻辑处理。
基本上,我正在寻找的输出如下:
pd.DataFrame({'ID':[4, 5, 6, 7], 'val1':['one', 'one', np.nan, 'seven'], 'val2':['hi', 'bye', 'hola', np.nan], 'val3':[3, 3, 4, np.nan]})
ID val1 val2 val3
0 4 one hi 3.0
1 5 one bye 3.0
2 6 NaN hola 4.0
3 7 seven NaN NaN
您能建议怎么做吗?
谢谢!
杰克
答案 0 :(得分:6)
使用
(
concat(
substring(to_char(A.time1), 1, 5)
, substring(to_char(A.time2), 6)
)
) interpolate previous value B.time
答案 1 :(得分:5)
之所以有效,是因为您如何定义问题。
首先,获取每个ID的第一行。接下来,找出哪些ID具有有效值并屏蔽其他所有内容。
v = df.groupby('ID', as_index=False).first()
v[df.groupby('ID', as_index=False).nunique().eq(1)]
ID val1 val2 val3
0 4 one hi 3.0
1 5 one bye 3.0
2 6 NaN hola 4.0
3 7 seven NaN NaN