有多少行具有来自同一列的值 pandas

数据挖掘 熊猫 数据框 金融
2022-02-19 19:19:13

我有一个包含许多列的 df,这些列代表组成索引的公司的市值。数据框的索引是日期。公司在进入指数之前或离开指数之后,df 中公司的市值为零。

我想知道指数不变的平均天数。

例如:

[in]: 
df = pd.DataFrame(np.array([[1, 1,np.nan], [np.nan,2, 10], [1,3, 100],[4,np.nan, 100]]), 
                           columns=['a', 'b','c'])

df
[out]:  
        a   b   c    
    0   1.0 1.0 NaN    
    1   NaN 2.0 10.0    
    2   1.0 3.0 100.0    
    3   4.0 NaN 100.0

我想知道的是有多少行有来自同一列的条目。

例如,第 0 行包含来自列 a 和 b 的条目。b 和 c 列的第 1 行。a、b 和 c 列的第 2 行。a 和 c 列的第 3 行。因此有 4 行具有唯一的列组合和 4 个更改。那么平均值为1。

2个回答

通过构建一个值是否存在的元组nan,您可以构建每个唯一值,例如:

代码:

def get_average_run_length(a_df):
    unique_run_lengths = set(
        tuple(not np.isnan(x) for x in row[1]) for row in df.iterrows())
    return len(a_df) / len(unique_run_lengths)

测试代码:

df = pd.DataFrame(
    [[1, 1, np.nan], [np.nan, 2, 10], [1, 3, 100], [4, np.nan, 100]],
    columns=list('abc'))

print(df)
print(get_average_run_length(df))

# double the last row
df = pd.concat([df, df.tail(1)])
print(df)
print(get_average_run_length(df))

结果:

     a    b      c
0  1.0  1.0    NaN
1  NaN  2.0   10.0
2  1.0  3.0  100.0
3  4.0  NaN  100.0

1.0

     a    b      c
0  1.0  1.0    NaN
1  NaN  2.0   10.0
2  1.0  3.0  100.0
3  4.0  NaN  100.0
3  4.0  NaN  100.0

1.25

我不完全确定我是否正确理解了您的问题。对于以下数据框,您想要什么结果:2/5因为 5 行中有 2 个不同的 NaN 组合,或者4/5因为 5 行中的索引组合有 4 次更改?

    a   b
0   1   NaN
1   NaN 2
2   3   NaN
3   NaN 4
4   5   NaN

Stephen Rauch 的回答涵盖了第一种情况。这个应该涵盖第二个:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.array([[1, 2, np.nan],
                            [3, 4, np.nan],
                            [6, np.nan, 7],
                            [8, np.nan, np.nan]]))

df_na = np.array(df.isna()[:-1])
df_na_shifted = np.array(df.isna()[1:])

number_of_good_cols = (df_na == df_na_shifted).sum(axis=1)

number_of_good_rows = sum(number_of_good_cols == df.shape[1])
print('The index changed on %d days.' % (df.shape[0] - 1 - number_of_good_rows))