Jac*_*tad 8 python python-3.x pandas
我有一个如下数据框:
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
Run Code Online (Sandbox Code Playgroud)
每个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
Run Code Online (Sandbox Code Playgroud)
你能建议怎么做吗?
谢谢!
插口
运用
test.groupby('ID',as_index=False).agg(lambda x : x.mode()[0] if x.nunique()==1 else np.nan)
Out[372]:
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
Run Code Online (Sandbox Code Playgroud)
这是因为你已经定义了你的问题.
首先,获取每个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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |