Murcielago
Murcielago

Reputation: 1005

pandas: iterate over multiple columns with is_monotonic_increasing

i am trying to iterate over a time series with multiple columns and go through the columns to check if the values within the columns are motonic_increasing or decreasing.

The underlying issue is that I don't know how to iterate over the dataframe columns and treat the values as a list to allow is_monotonic_increasing to work.

I have a dataset that looks like this:

Id          10000T   20000T
2020-04-30      0         7
2020-05-31      3         5
2020-06-30      5         6

and I have tried doing this:

trend_observation_period = new_df[-3:] #the dataset
trend = np.where((trend_observation_period.is_monotonic_increasing()==True), 'go', 'nogo')

which gives me the error:

AttributeError: 'DataFrame' object has no attribute 'is_monotonic_increasing'

I am confused because I though that np.where would iterate over the columns and read them as np arrays. I have also tried this which does not work either.

for i in trend_observation_period.iteritems():
    s = pd.Series(i)
    trend = np.where((s.is_monotonic_increasing()==True  | s.is_monotonic_decreasing()==True),
                     'trending', 'not_trending')

Upvotes: 1

Views: 523

Answers (3)

Nathan Furnal
Nathan Furnal

Reputation: 2410

Use .apply and is_monotonic.

Example :

import pandas as pd
df = pd.DataFrame({"A":[1, 2, 3, 4], 
                   "B":[0, 1, 0, 1], 
                   "C":[3, 5, 8, 9], 
                   "D":[1, 2, 2, 1]})

df.apply(lambda x:x.is_monotonic)

A     True
B    False
C     True
D    False
dtype: bool

Upvotes: 0

Cameron Riddell
Cameron Riddell

Reputation: 13417

You can use DataFrame.apply to apply a function to each of your columns. Since is_monotonic_increasing is a property of a Series and not a method of it, you'll need to wrap it in a function (you can use lambda for this):

df = pd.DataFrame({'a': [1, 1, 1, 1],
                   'b': [1, 1, 1, 0],
                   'c': [0, 1, 1, 0],
                   'd': [0, 0, 0, 0]})


increasing_cols = df.apply(lambda s: s.is_monotonic_increasing)

print(increasing_cols)
a     True
b    False
c    False
d     True
dtype: bool

Upvotes: 1

s3dev
s3dev

Reputation: 9711

It sounds like you're after something which will iterate columns and test if each column is monotonic. See if this puts you on the right track.

Per the pandas docs .is_monotonic is the same as .is_monotonic_increasing.

Example:

# Sample dataset setup.
df = pd.DataFrame({'a': [1, 1, 1, 2],
                   'b': [3, 2, 1, 0],
                   'c': [0, 1, 1, 0],
                   'd': [2, 0, 1, 0]})

# Loop through each column in the DataFrame and output if monotonic.
for c in df:
    print(f'Column: {c} I', df[c].is_monotonic)
    print(f'Column: {c} D', df[c].is_monotonic_decreasing, end='\n\n')

Output:

Column: a I True
Column: a D False

Column: b I False
Column: b D True

Column: c I False
Column: c D False

Column: d I False
Column: d D False

Upvotes: 2

Related Questions