使用pandas数据框进行数据操作

3

我有一个MxN的numpy数组数据。 它们在csv文件中,我正在使用pandas模块读取。

sv-01   sv-02  SV-03  state-01 state-02 state-03    val-01   val-02  val-03
7        12     8         B          B         B     .23     0.34    1.03
7        12     8         B          B         A     .35     0.10    0
7        12     8         B          A         A     1.45    0       0
7        12     8         A          A         A      0      0       0
7        12     8         A          B         B      0      1.23    3.21

为了我的计算目的,我需要两个变量。在每一行中,如果状态为A,则相应的卫星将不被考虑在内。因此,第一行中总的SV数为3。类似地,其他行的数量为2、1、0、1。另一个变量是计数的数量。如果任何一行没有单独的B,则该行不会被计算。最后一行将被视为2,因为有两个B存在。

 #So my expected output is 
 #Total count is 4
 #and number of satellites used is 3,2,1,0,1 in each row or iteration

如何迭代我的数据。
谢谢。

最后一行应该算作2吗?您是否在计算状态列中的B的数量? - White
1个回答

2

首先使用filter函数筛选并比较所有数据与A,统计True的数量,最后使用rsub函数将B减去。

a = df.filter(like='state').eq('A').sum(axis=1).rsub(3)
#same as
#a = 3 - (df.filter(like='state') == 'A').sum(axis=1)
print (a)
0    3
1    2
2    1
3    0
4    2
dtype: int64

详细信息:

print (df.filter(like='state'))
  state-01 state-02 state-03
0        B        B        B
1        B        B        A
2        B        A        A
3        A        A        A
4        A        B        B

print (df.filter(like='state').eq('A'))
   state-01  state-02  state-03
0     False     False     False
1     False     False      True
2     False      True      True
3      True      True      True
4      True     False     False

要计算所有非 A 行,请使用any来检查至少一个True并使用sum

b = df.filter(like='state').eq('A').any(1).sum()
print (b)
4

print (df.filter(like='state').eq('A').any(1))
0    False
1     True
2     True
3     True
4     True
dtype: bool

全部在一起:

mask = df.filter(like='state').eq('A')
a = mask.sum(axis=1).rsub(3)
print (a)
0    3
1    2
2    1
3    0
4    2
dtype: int64

b = mask.any(1).sum()
print (b)
4

@jezrael 我有两个疑问。1. 什么是'like'。2. 如何计算总数。在这个例子中,总数为4,因为第四行没有B。 - Poka
它与 3 - (df.filter(like='state') == 'A').sum(axis=1) 相同。因此从右边减去。如果使用 sub,则为 (df.filter(like='state') == 'A').sum(axis=1) - 3 - jezrael
@ Jezrael。再次回到同一个话题。在第一个解决方案中,''a = df.filter(like='state').eq('A').sum(axis=1).rsub(3)'' 我能否加入OR条件?我还有一个条件。如果任何一个州的卫星有0值,则不考虑该卫星。其他事情保持不变。 - Poka
@ Jezrael。例如,同样的数据.a = 7 12 8 B B A .35 0 0.所以计数应该是1,sat也是1。 - Poka
非常抱歉,因家人来访而离线,后来也忘记了您的留言 :( - jezrael
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接