Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 通过使用Dataframe排除特定字来计算每一行_Python 3.x_Pandas_Dataframe - Fatal编程技术网

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个值。是这样吗?不,所有的长度都应该相同。谢谢您的尝试,但我的数据已经在数据帧中,而不是在文件中。您的尝试似乎需要考虑从文件读取数据。我使用的数据框看起来和你的一模一样。让我用我使用的数据框编辑它。谢谢你的尝试,但我的数据已经在数据框中,而不是在文件中。您的尝试似乎需要考虑从文件读取数据。我使用的数据框看起来和你的一模一样。让我用我使用的数据框编辑它。