pandas 巨蟒|根据值获取范围

y53ybaqx  于 2023-02-28  发布在  其他
关注(0)|答案(2)|浏览(100)

我如何才能到达- Input -Input下方
和输出-Output
我尝试使用shift,但没有得到结果

df1['Value_shift_down'] = df1['Value'].shift(-1)
df1['Value_shift_up'] = df1['Value'].shift(1)
gmxoilav

gmxoilav1#

Pandas.shift()的应用是正确的,不用在字符串和整数之间来回转换,可以利用shift将每个值与前一个值进行比较,然后使用累积和(.cumsum())来检测值何时改变。最后一个元素是DataFrame .groupby() method,它允许我们将相同的-Value行集合在一起,并获得该组的起始和结束Unit

result_groups = []
for _, group in df1.groupby((df1["Value"] != df1["Value"].shift()).cumsum()):
    start_unit = group.loc[group.index.min(), "Unit"]
    end_unit = group.loc[group.index.max(), "Unit"]
    value = group["Value"].unique()[0]
    result_groups.append({"Start_Unit": start_unit, "End_Unit": end_unit, "Value": value})
results = pd.DataFrame(result_groups)

results数据框如下所示(根据需要):
| | * * 开始单位**|* * 结束单位**|* * 价值**|
| - ------|- ------|- ------|- ------|
| 无|第一单元|第一单元|第二章|
| 1个|第二单元|第二单元|四个|
| 第二章|第三单元|第三单元|1个|
| 三个|第四单元|第五单元|五个|
| 四个|第六单元|第六单元|七|
| 五个|第七单元|第七单元|六个|
| 六个|第八单元|第八单元|九|
| 七|第九单元|第二十单元|无|
注意:这个解决方案不要求'Value'列中的值在一个组一个组的基础上是唯一的(即,如果以后有另一个5序列,它会正确地将其识别为一个新组)。如果您提前知道这种情况永远不会发生,您可以采取一个更简单的方法,只使用df1.groupby("Value"),并在循环中做类似的事情。

eeq64g8w

eeq64g8w2#

基于字符串确定最小值和最大值是不可能的(因为“10”小于“2”)。因此,您需要用整数替换字符串。
因此,一个解决方案可能是删除单元名称,并将单元名称数字转换为整数,然后您可以通过透视表确定最小值和最大值。

df['Unit'] = df['Unit'].str.replace('Unit ', '', regex=False).astype(int)
df.pivot_table(index='Value', values='Unit', aggfunc=['min', 'max'])

如有必要,您可以随后将值转换回字符串并添加单元名称。

相关问题