[英]Python Dataframe setting values for a column based on groups maximum value
[英]Reorder groups of values in the column with a new maximum value
我有一个 Pandas 数据框,其中有一列按升序排列的数字组:
column
1
2
3
4
5
6
0
1
2
3
4
1
2
3
4
5
0
0
我想重组最大值 > 4 的那些序列组。升序应该保持不变,但最大数字必须为 4。为此,我需要复制一个或多个中间数字。 所以我希望该列看起来像这样:
column
1
2
2
2
3
4
0
1
2
3
4
1
2
2
3
4
0
0
零应该保持原样。
首先,我尝试使分组变量:
k = 0
l = 1
i = 0
for k in range(1, len(df)):
if df.loc[k, 'column'] != 0:
if df.loc.loc[k, 'column'] > df.loc.loc[k-1, 'column']:
df.loc.loc[k, 'position'] = l
else:
l = l + 1
df.loc.loc[k, 'position'] = l
else:
df.loc.loc[k, 'position'] = 0
l = l + 1
l=pd.DataFrame(df.loc.groupby('position')['columns'].max()).reset_index()
然后我试图想出这样的东西,但这不适用于不同的最大值(不仅仅是4):
z = 1
r = 0
for z in range (1, len(l)-1):
if l.loc[z,'column'] > 4:
for r in range(0, l.loc[z,'column'] - 3):
df.loc[df['column']==2+r, 'column'] = 2
df['column'] = np.where(df['column'] > 2, df['column'] - r, df['column'])
请帮忙!
使用groupby
对每组单调增加进行分组,然后做一些数学归一化回到 1-4 范围:
MAX_NUMBER = 4
>>> df['column'].groupby((df['column'].diff() < 0).cumsum())\
.apply(lambda s: s//(max(s)/MAX_NUMBER))\
.fillna(0)
我在这里所做的只是将所有数字绝对除以max(s)/4
,最终结果与您的非常相似。 但是您可以随意使用您想要的任何自定义函数(例如,您可以手动将 0、1 设置为第一个位置,将 3、4 设置为最后一个位置,然后在中间填充2
等)。
column
0 0.0
1 1.0
2 2.0
3 2.0
4 3.0
5 4.0
6 0.0
7 1.0
8 2.0
9 3.0
10 4.0
11 0.0
12 1.0
13 2.0
14 3.0
15 4.0
16 0.0
17 0.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.