Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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 如何计算数据帧中的特定行元组?_Python_Pandas - Fatal编程技术网

Python 如何计算数据帧中的特定行元组?

Python 如何计算数据帧中的特定行元组?,python,pandas,Python,Pandas,我有一些数据帧,由以下代码生成: from collections import defaultdict import pandas as pd mydict = { ('x305', 'BoxType1-1'): { 'box': 'x305', 'box#': '0', 'boxCode': 'Z8', 'version': '00.00' }, ('x305', 'BoxType1-2'): { 'box': 'x305', 'box#': '0', 'boxCod

我有一些数据帧,由以下代码生成:

from collections import defaultdict
import pandas as pd

mydict = { ('x305', 'BoxType1-1'): { 'box': 'x305', 'box#': '0', 'boxCode': 'Z8', 'version': '00.00' },
           ('x305', 'BoxType1-2'): { 'box': 'x305', 'box#': '0', 'boxCode': 'K8', 'version': '01.00' },
           ('x307', 'BoxType1-1'): { 'box': 'x307', 'box#': '0', 'boxCode': 'Z8', 'serialNo': 'None', 'version': '00.00' },
           ('x307', 'BoxType2-1'): { 'box': 'x307', 'box#': '0', 'boxCode': 'Z8', 'serialNo': 'None', 'version': '00.00' }, 
           ('x403', 'BoxType1-1'): { 'box': 'x403', 'box#': '0', 'boxCode': 'Z8', 'bla': 'None', 'version': '00.00' }, 
           ('x405', 'BoxType1-2'): { 'box': 'x405', 'box#': '0', 'boxCode': 'Z8', 'serialNo': 'None', 'version': '00.00' }, 
           ('x405', 'BoxType2-1'): { 'box': 'x405', 'box#': '0', 'boxCode': 'Z8', 'version': '00.00' }, 
           ('x510', 'BoxType1-3'): { 'box': 'x510', 'box#': '0', 'boxCode': 'Z8', 'version': '01.00' } }

boxTypes = [ 'BoxType1', 'BoxType2' ]
dataframes = defaultdict( set )

for boxType in boxTypes:
   dataframes[ boxType ] = pd.DataFrame.from_dict( { ( box, bt ): mydict[ ( box, bt ) ]
                                                     for box, bt in mydict.keys()
                                                     if boxType in bt },
                                                   orient='index' )

print dataframes[ 'BoxType1' ]
                 box   version box# boxCode  bla serialNo
x305 BoxType1-1  x305   00.00    0      Z8   NaN      NaN
     BoxType1-2  x305   01.00    0      K8   NaN      NaN
x307 BoxType1-1  x307   00.00    0      Z8   NaN     None
x403 BoxType1-1  x403   00.00    0      Z8  None      NaN
x405 BoxType1-2  x405   00.00    0      Z8   NaN     None
x510 BoxType1-3  x510   01.00    0      Z8   NaN      NaN       
现在,我试图找到一种方法来计算整个数据帧中的特定行元组。例如,我希望有这样一个函数:

def countRowTuples( df, columns ):
    '''
    Count occurrences of row tuple in dataframe
    and return a new dataframe with a count column at the end
    '''

df2 = countRowTuples( dataframes['BoxType1'], columns=[ boxCode, bla, version ] )

df2 = 
                 box   version box# boxCode  bla serialNo  count
x305 BoxType1-1  x305   00.00    0      Z8   NaN      NaN    3
     BoxType1-2  x305   01.00    0      K8   NaN      NaN    1
x307 BoxType1-1  x307   00.00    0      Z8   NaN     None    3
x403 BoxType1-1  x403   00.00    0      Z8  None      NaN    1
x405 BoxType1-2  x405   00.00    0      Z8   NaN     None    3
x510 BoxType1-3  x510   01.00    0      Z8   NaN      NaN    1
df2 = 
    version boxCode  bla   count
1   00.00     Z8     NaN     3
2   01.00     K8     NaN     1
3   00.00     Z8     None    1
4   01.00     Z8     NaN     1
或者,该函数可以删除原始索引和重复行,并返回如下数据帧:

def countRowTuples( df, columns ):
    '''
    Count occurrences of row tuple in dataframe
    and return a new dataframe with a count column at the end
    '''

df2 = countRowTuples( dataframes['BoxType1'], columns=[ boxCode, bla, version ] )

df2 = 
                 box   version box# boxCode  bla serialNo  count
x305 BoxType1-1  x305   00.00    0      Z8   NaN      NaN    3
     BoxType1-2  x305   01.00    0      K8   NaN      NaN    1
x307 BoxType1-1  x307   00.00    0      Z8   NaN     None    3
x403 BoxType1-1  x403   00.00    0      Z8  None      NaN    1
x405 BoxType1-2  x405   00.00    0      Z8   NaN     None    3
x510 BoxType1-3  x510   01.00    0      Z8   NaN      NaN    1
df2 = 
    version boxCode  bla   count
1   00.00     Z8     NaN     3
2   01.00     K8     NaN     1
3   00.00     Z8     None    1
4   01.00     Z8     NaN     1
有人知道我该怎么做吗

我尝试了以下操作,但始终返回一个空数据帧:(


一种方法是添加另一个填充了“值”的列,按需要不同值的字段分组(需要用一些值填充这些“值”)并对添加的列求和

df['count'] = 1
df_grouped = df[['boxCode', 'bla', 'version', 'count']].groupby(by=['boxCode', 'bla', 'version'], as_index=False).sum()

一种方法是添加另一个填充了“值”的列,按需要不同值的字段分组(需要用一些值填充这些“值”)并对添加的列求和

df['count'] = 1
df_grouped = df[['boxCode', 'bla', 'version', 'count']].groupby(by=['boxCode', 'bla', 'version'], as_index=False).sum()

由于空值,分组依据未执行所需的计数。请尝试以下操作:

dataframes['BoxType1'].fillna("NaN").groupby(["version", "boxCode", "bla"]).size().reset_index(name="count")

由于空值,分组依据未执行所需的计数。请尝试以下操作:

dataframes['BoxType1'].fillna("NaN").groupby(["version", "boxCode", "bla"]).size().reset_index(name="count")

第一行中的4来自哪里?为什么是4?你能显示生成输入df的代码吗?@Scott Boston-我已经编辑了我的问题,包括用于生成数据帧的代码。谢谢。第一行中的4来自哪里?为什么是4?你能显示生成输入df的代码吗?@Scott Boston-我已经编辑了我的问题包括用于生成数据帧的代码。谢谢。谢谢John Redford。这很好,但是有没有一种方法可以用NaN来计算行数?或者我应该在数据帧中创建默认值而不是NaN来实现这一点?编辑:Seiji Armstrong提供的解决方案可以实现这一点。如果您使用c我会详细说明你的答案,这样当功能中有人遇到类似问题时可以理解答案。谢谢John Redford。这很有效,但是有没有一种方法我也可以用NaN来计算行数?或者我应该在我的数据帧中创建默认值而不是NaN来工作?编辑:提供的解决方案Seiji Armstrong完成了这项工作。如果您能详细说明您的答案,这样当功能中出现类似问题的人能够理解答案,那就更好了。谢谢Seiji Armstrong,这正是我想要的!不用担心,我不久前也遇到过类似问题。顺便说一句,我使用了
“NaN”
匹配您的输出,但通常使用此
str
不是好的做法,因为它可能会与
NaN
空值混淆。谢谢Seiji Armstrong这正是我要找的!不用担心,我不久前遇到过类似问题。顺便说一句,我使用了
NaN
匹配您的输出,但通常使用此
str
不是好的做法,因为它可能与
NaN
空值混淆。