我有以下DF:
data = [
['a', 'one', 10],
['a', 'two', 10],
['b', 'one', 13],
['b', 'two', 100],
['c', 'two', 100],
['c', 'one', 100],
['d', 'one', 100],
['d', 'one', 10
]
df = pd.DataFrame(data, columns=['key1', 'key2', 'key3'])
个字符
我需要按key1
分组,
- 搜索
key2 == 'one'
(对于单次出现结果= OK,对于0或>1 = NOK), - 另外检查
key3 == 10
或100
是否OK,其他任何都是NOK。
结果应该是OK
或NOK
。我怎样才能获得类似以下内容的输出?
key1 result
a ok
b nok
c ok
d nok
型
我发现了一个类似的问题,并回答了here,但没有额外检查key3
。到目前为止,我所拥有的是以下内容:
test = df.groupby('key1')['key2'].apply(lambda x:(x=='one').sum()).reset_index(name='result')
test['result'].where(~(test['result'] > 1), other='nok', inplace=True)
test['result'].replace([0, 1], ['nok', 'ok'], inplace = True)
型
当我运行这段代码时,它会给出以下输出:
key1 result
0 a ok
1 b ok
2 c ok
3 d nok
型
如何添加key3
的支票?
2条答案
按热度按时间nle07wnf1#
IIUC,您可以尝试:
字符串
图纸:
型
gblwokeq2#
单行使用:
groupby('key1')['key2'].value_counts().xs('one', level='key2') == 1)
用于检查key2
groupby('key1')['key3'].unique()
获取每个key1
的key3
值isin([10, 100]).all(axis=1)
检查key3
上的条件字符串
它比使用
groupby().apply()
慢2倍。参见下面的比较:型
所用方法的文件:
value_counts()
计数出现次数xs()
获取 Dataframe 的横截面unique()
个isin()
检查是否有key3
值不在“ok”列表中all(axis=1)
按行检查真值replace()
用"ok"
和"nok"
替换bool