Python 3.x 通过使用Dataframe排除特定字来计算每一行
我有一个熊猫数据框,看起来如下所示:Python 3.x 通过使用Dataframe排除特定字来计算每一行,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有一个熊猫数据框,看起来如下所示: id info_type1 pval1_1 pval2_1 info_type2 pval1_2 pval2_2 info_type3 pval1_3 pval2_3 ione11 IT void 0.05 void 1.0 void IT void void 0.04
id info_type1 pval1_1 pval2_1 info_type2 pval1_2 pval2_2 info_type3 pval1_3 pval2_3
ione11 IT void 0.05 void 1.0 void IT void void 0.04
ione77 IV 1.0 void void 1.0 void void void void 0.04
对于每一行,我都试图计算没有单词void的字段数。计数不应包括字段id(第一个字段)。例如,对于第一行,有5个字段的值不是void,第2行有4个值。因此,我将以一个ID列表结束,其中包含它们的值计数。例如:
id count
ione11 5
ione77 4
如果我使用df.iterrows()进行迭代,我将无法检查每行的所有列。你如何着手解决这个问题
非常感谢。您可以将每个项目映射为一个整数,然后对行求和
import numpy as np
import pandas as pd
df = pd.DataFrame([["it", "void", "1"], ["it", "void", "1"]])
df = df.applymap(lambda x: 1 if x == 'void' else 0)
df = df.sum(axis = 1))
资源:
import numpy as np
import pandas as pd
df = pd.DataFrame([["it", "void", "1"], ["it", "void", "1"]])
df = df.applymap(lambda x: 1 if x == 'void' else 0)
df = df.sum(axis = 1))
资源:
:
df\upd=DataFrame()
df_['id']=df['id']
df_['count']=df.apply(lambda行:len(行[1:])-行[1:].tolist().count('void'),轴=1)
要计算序列中出现的void
,还可以使用sum(行[1:].isin(['void'])
尝试对行应用
df\upd=DataFrame()
df_['id']=df['id']
df_['count']=df.apply(lambda行:len(行[1:])-行[1:].tolist().count('void'),轴=1)
要计算序列中出现的void
,还可以使用sum(行[1:].isin(['void'])
这样做的方法是将void
转换为NaN
,并使用notna()
和sum()
获得所有非NaNs
元素的计数,如下所示:
df = pd.DataFrame({'id': {'ione11': 'IT', 'ione77': 'IV'}, 'info_type1': {'ione11': 'void', 'ione77': '1.0'}, 'pval1_1': {'ione11': '0.05', 'ione77': 'void'}, 'pval2_1': {'ione11': 'void', 'ione77': 'void'}, ' info_type2': {'ione11': 1.0, 'ione77': 1.0}, 'pval1_2': {'ione11': 'void', 'ione77': 'void'}, 'pval2_2': {'ione11': 'IT', 'ione77': 'void'}, 'info_type3': {'ione11': 'void', 'ione77': 'void'}, 'pval1_3': {'ione11': 'void', 'ione77': 'void'}, 'pval2_3': {'ione11': 0.04, 'ione77': 0.04}})
df = df.T.replace({'void' : np.nan}).notna().sum().reset_index().rename(columns={0: 'count', 'index': 'id'})
df
输出:
id count
0 ione11 5
1 ione77 4
这样做的方法是将void
转换为NaN
,并使用notna()
和sum()
获得所有非NaNs
元素的计数,如下所示:
df = pd.DataFrame({'id': {'ione11': 'IT', 'ione77': 'IV'}, 'info_type1': {'ione11': 'void', 'ione77': '1.0'}, 'pval1_1': {'ione11': '0.05', 'ione77': 'void'}, 'pval2_1': {'ione11': 'void', 'ione77': 'void'}, ' info_type2': {'ione11': 1.0, 'ione77': 1.0}, 'pval1_2': {'ione11': 'void', 'ione77': 'void'}, 'pval2_2': {'ione11': 'IT', 'ione77': 'void'}, 'info_type3': {'ione11': 'void', 'ione77': 'void'}, 'pval1_3': {'ione11': 'void', 'ione77': 'void'}, 'pval2_3': {'ione11': 0.04, 'ione77': 0.04}})
df = df.T.replace({'void' : np.nan}).notna().sum().reset_index().rename(columns={0: 'count', 'index': 'id'})
df
输出:
id count
0 ione11 5
1 ione77 4
您可以对布尔掩码df!='作废“
(通过将id设置为索引忽略它):
df.set_index('id').ne('void').sum(axis=1)。reset_index(name='count'))
#身份证计数
#0.11.5
#1.77 4
您可以对布尔掩码求和df!='作废“
(通过将id设置为索引忽略它):
df.set_index('id').ne('void').sum(axis=1)。reset_index(name='count'))
#身份证计数
#0.11.5
#1.77 4
Nice solution然而,当我尝试打印dfê时,它不包括id,只包括与id不同的索引。@aBiologist你看到我的另一个打印(dfê.resetêu index().rename(columns={'index':'id'))
?是的,尝试了。Id不是索引,它是Dataframe中的另一列。此外,计数不应该对id列进行计数,因此计数不太正确。@Abologist在您的示例数据中,第一行有10个值,而其他行有11个值。这是对的吗?不,应该都有相同的长度。不过,很好的解决方案是,当我尝试打印df挈时,它不包括id,只包括与id不同的索引。@aBiologist你看到我的另一个打印(df挈.reset挈index().rename(columns={'index':'id'))
?是的,尝试了。Id不是索引,它是Dataframe中的另一列。此外,计数不应该对id列进行计数,因此计数不太正确。@Abologist在您的示例数据中,第一行有10个值,而其他行有11个值。是这样吗?不,所有的长度都应该相同。谢谢您的尝试,但我的数据已经在数据帧中,而不是在文件中。您的尝试似乎需要考虑从文件读取数据。我使用的数据框看起来和你的一模一样。让我用我使用的数据框编辑它。谢谢你的尝试,但我的数据已经在数据框中,而不是在文件中。您的尝试似乎需要考虑从文件读取数据。我使用的数据框看起来和你的一模一样。让我用我使用的数据框编辑它。