我有一个数据框,看起来像:
ID | timestamp |Phase| current
========================================
001 | 2020-09-20 07:00 | A | 1.4
001 | 2020-09-20 07:00 | B | 2.0
001 | 2020-09-20 07:00 | C | 1.6
002 | 2020-09-20 09:00 | A | 1.4
002 | 2020-09-20 09:00 | B | 1.23
002 | 2020-09-20 09:00 | C | 1.46
我需要计算每个ID/时间戳分组阶段的百分比差异,因此我创建了一个groupby:
imbalanced = df.groupby(['timestamp','ID']).apply(calcImbalance)
下面是calcImbalance:
def calcImbalance(pole):
phA = pole.loc[pole['Phase'] == 'A']['current'].astype('float')
phB = pole.loc[pole['Phase'] == 'B']['current'].astype('float')
phC = pole.loc[pole['Phase'] == 'C']['current'].astype('float')
imb = abs((phA-phB)/phB)
print ('imb:', imb)
if imb >= 0.3:
return pole
imb = abs((phB-phA)/phA)
if imb >= 0.3:
return pole
imb = abs((phA-phC)/phC)
if imb >= 0.3:
return pole
imb = abs((phC-phA)/phA)
if imb >= 0.3:
return pole
但这只是打印:
imb: 2661 NaN
2662 NaN
Name: Amps, dtype: float64
imb: 2661 NaN
2662 NaN
Name: Amps, dtype: float64
然后
引发异常:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我要做的是创建一个数据帧,只包含df中具有>;各阶段之间的差异为30%。我想我是为了一些看起来应该是琐碎的事情而掉进了兔子洞里
在上述示例中,“不平衡”数据帧应包含:
ID | timestamp |Phase| current
========================================
001 | 2020-09-20 07:00 | A | 1.4
001 | 2020-09-20 07:00 | B | 2.0
apply(应用)功能不会测试相位B和B之间的不平衡;C、 只有A&;B及A&;C
编辑:此代码回答问题,包括编辑
返回:
根据您的代码,这可能有效。这会将电流收集到一个列表中,并将其传递给
calcImbalance
函数输出
更新
根据您发布的更新,这可能不是完整答案,但仍有助于获得解决方案
IIUC您可以使用函数找到所需的行
输出
这是怎么回事
查找阶段之间发生更改的组>。三十
输出
这给出了组中的百分比变化
输出
每组的累积变化
输出
此解决方案可以检测到什么
在数据帧中
使用此解决方案
结果。注意
cng
是计算第一行更改的累积乘积相关问题 更多 >
编程相关推荐