【发布时间】:2021-01-08 20:37:56
【问题描述】:
我有一个看起来像这样的数据框:
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 和 C 之间的不平衡,只测试 A & B 和 A & C
【问题讨论】:
-
请根据显示的示例数据显示预期结果的示例。
-
另外,
imb是pandas.Series,而不是单个值。当您进行比较时,imb > 0.3它需要知道您是指该系列中的任何值还是所有值。在示例的情况下,imb为空,因此示例没有帮助。 -
阶段之间哪一行有变化> .3?我找不到任何 IIUC。
-
对不起,我的样本数据不好,没有不平衡>= 30%的实例!
-
好的,已编辑示例。 ID 001 阶段 A&B 相差 42%。:abs((1.4-2)/1.4)=.42,所以它(ID 001 应该包含在不平衡的数据帧中。
标签: python pandas pandas-groupby pandas-apply