is there a simpler method to make a pandas.series monotonic?

  • Last Update :
  • Techknowledgy :

Theres actually a very simple way to do this with df.cummax().

cols = ['your', 'columns']
mon_inc = (df[cols].cummax().diff().fillna(.1) > 0).all(axis = 1)
df[mon_inc]

You could keep taking the difference in rows using the diff method until all values are greater than 0.

while True:
   mon_inc = df['x'].diff().fillna(0) >= 0
if mon_inc.all():
   break
df = df[mon_inc]

And a function to do any number of columns

def make_monotonic(df, cols = None):
   if cols is None:
   cols = df.columns

df1 = df.copy()[cols]

while True:
   mon_inc = (df1.diff().fillna(0) >= 0).all(axis = 1)
if mon_inc.all():
   break
df1 = df1[mon_inc]
return df1

Suggestion : 2

Theres actually a very simple way to do this with df.cummax().,How do you make plotting two pandas Series in the same ipython notebook cell use different colors automatically?,Is there any simpler method in pandas to replace null values other than loop in this case?,Is there a better way than this to make bar plot of UNIQUE counts between categorical pandas columns

Theres actually a very simple way to do this with df.cummax().

cols = ['your', 'columns']
mon_inc = (df[cols].cummax().diff().fillna(.1) > 0).all(axis = 1)
df[mon_inc]

You could keep taking the difference in rows using the diff method until all values are greater than 0.

while True:
   mon_inc = df['x'].diff().fillna(0) >= 0
if mon_inc.all():
   break
df = df[mon_inc]

And a function to do any number of columns

def make_monotonic(df, cols = None):
   if cols is None:
   cols = df.columns

df1 = df.copy()[cols]

while True:
   mon_inc = (df1.diff().fillna(0) >= 0).all(axis = 1)
if mon_inc.all():
   break
df1 = df1[mon_inc]
return df1

Suggestion : 3

Let’s create a simple DataFrame to perform this operation as shown below.,You can also perform type casting to convert a DataFrame column to a list.It is similar to using the tolist() method wherein you select the column which is to be converted and then typecast it to a list.,The columns of a pandas DataFrame are also pandas Series objects. You can convert the columns into a list using the tolist() method.,After loading/creating the DataFrame, use the tolist() method on the selected column.

Let’s create a simple pandas series as an example.

import pandas as pd

# Create the data of the series as a dictionary
data_ser = {
   'Name': 'Sony',
   'Country of Origin': 'Japan',
   'Revenue': 25000000000
}

# Create the series
ser = pd.Series(data_ser)

ser
Name Sony
Country of Origin Japan
Revenue 25000000000
dtype: object

To convert a pandas Series to a list, simply call the tolist() method on the series which you wish to convert.

# Convert the series to a list
list_ser = ser.tolist()

print('Created list:', list_ser)

Let’s create a simple DataFrame to perform this operation as shown below.

# Create the data of the DataFrame as a dictionary
data_df = {
   'Name': ['Sony', 'Tencent', 'Nintendo', 'Microsoft', 'Activision Blizzard'],
   'Country of Origin': ['Japan', 'China', 'Japan', 'USA', 'USA'],
   'Revenue': [25000000000, 13900000000, 12100000000, 11600000000, 8100000000]
}

# Create the DataFrame
df = pd.DataFrame(data_df)

df

After loading/creating the DataFrame, use the tolist() method on the selected column.

# Convert the name column of the DataFrame to a list
name_list = df['Name'].tolist()

print('Created list:', name_list)
print('Data type of the created list:', type(name_list))

Suggestion : 4

Monotonic could be both increasing or anycodings_pandas decreasing, the functions below will anycodings_pandas return exclude all values that brean anycodings_pandas monotonicity.,Here is a way to produce a monotonically anycodings_pandas increasing series:,Below is a simple way of finding the anycodings_pandas longest monotonic ascending array given anycodings_pandas your constraints using plain python:,Perhaps you want to find the longest anycodings_pandas monotonic array? because that's a anycodings_pandas completely different search problem.

For example

s = pd.Series([0, 1, 2, 3, 10, 4, 5, 6])

or

s = pd.Series([0, 1, 2, 3, -1, 4, 5, 6])

we would extract

s = pd.Series([0, 1, 2, 3, 4, 5, 6])

However, there seems to be a confusion anycodings_pandas in your question, given the series s = anycodings_pandas pd.Series([0,1,2,3,10,4,5,6]), 10 anycodings_pandas doesn't break monotonicity conditions, anycodings_pandas 4, 5, 6 do. So the correct answer there anycodings_pandas is 0, 1, 2, 3, 10

import pandas as pd

s = pd.Series([0, 1, 2, 3, 10, 4, 5, 6])

def to_monotonic_inc(s):
   return s[s >= s.cummax()]

def to_monotonic_dec(s):
   return s[s <= s.cummin()]

print(to_monotonic_inc(s))
print(to_monotonic_dec(s))

Below is a simple way of finding the anycodings_pandas longest monotonic ascending array given anycodings_pandas your constraints using plain python:

def get_longeset_monotonic_asc(s):
   enumerated = sorted([(v, i) for i, v in enumerate(s) if v >= s[0]])[1: ]
output = [s[0]]
last_index = 0
for v, i in enumerated:
   if i > last_index:
   last_index = i
output.append(v)

return output

s1 = [0, 1, 2, 3, 10, 4, 5, 6]
s2 = [0, 1, 2, 3, -1, 4, 5, 6]

print(get_longeset_monotonic_asc(s1))
print(get_longeset_monotonic_asc(s2))

''
'
Output:

   [0, 1, 2, 3, 4, 5, 6]
   [0, 1, 2, 3, 4, 5, 6]

''
'

Here is a way to produce a monotonically anycodings_pandas increasing series:

import pandas as pd

# create data
s = pd.Series([1, 2, 3, 4, 5, 4, 3, 2, 3, 4, 5, 6, 7, 8])

# find max so far(i.e., running_max)
df = pd.concat([s.rename('orig'),
   s.cummax().rename('running_max'),
], axis = 1)

# are we at or above max so far ?
   df['keep?'] = (df['orig'] >= df['running_max'])

# filter out one or many points below max so far
df = df.loc[df['keep?'], 'orig']

# verify that remaining points are monotonically increasing
assert pd.Index(df).is_monotonic_increasing

# print(df.drop_duplicates()) # eliminates ties
print(df) # keeps ties

0 1
1 2
2 3
3 4
4 5
10 5 # < --same as previous value--a tie
11 6
12 7
13 8
Name: orig, dtype: int64