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
空值混淆。