Python - 根据条件获取Dataframe的开始和结束索引

时间:2018-01-26 13:30:46

标签: python pandas dataframe record

我正在寻求以下方面的帮助。

假设我有一个python数据帧如下:

Index A    B    C
1     10   15   20
2     Null 20   11
3     Null 10   Null
4     Null Null Null
5     29   35   40

我想通过遍历所有列和行来创建如下所示的记录。

StartIndex    EndIndex    ColumnName    Comment
2             4           A             Null
4             4           B             Null
3             4           C             Null

在这里,我可能还需要根据上面的NULL以外的其他条件创建记录。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:0)

选项1

In [236]: d = df[list('ABC')].eq('Null')

In [246]: pd.DataFrame([[s[s].index[0]+1, s[s].index[-1]+1, 'Null', c] 
                        for c, s in d.items()], 
                       columns=['StartIndex', 'EndIndex', 'Comment', 'ColumnName'])
Out[246]:
   StartIndex  EndIndex Comment ColumnName
0           2         4    Null          A
1           4         4    Null          B
2           3         4    Null          C

选项2

In [225]: df[['A','B','C']].eq('Null').apply(lambda x: pd.Series(
                      [x[x].index[0]+1, x[x].index[-1]+1, 'Null', x.name],
                      index=['StartIndex', 'EndIndex', 'Comment', 'ColumnName'])
                    ).T
Out[225]:
  StartIndex EndIndex Comment ColumnName
A          2        4    Null          A
B          4        4    Null          B
C          3        4    Null          C

答案 1 :(得分:0)

以下是数据框定义的示例,您可以将Null替换为np.NaN来执行相同操作:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [10, None, None, None, 29], 'B': [15, 20, 10, None, 35], 'C': [20, 11, None, None, 40]},
                  index = range(1,6))
vars = df.columns.tolist()
df.reset_index(inplace=True)

df = df.melt(id_vars=['index'], value_vars=vars, var_name='ColumnName')

df = df[df['value'].isnull()].groupby(['ColumnName'], as_index=False)['index'].agg({'StartIndex': 'first', 'EndIndex': 'last'}).assign(Comment=lambda x: np.NaN)

df

#  ColumnName  EndIndex  StartIndex  Comment
#0          A         4           2      NaN
#1          B         4           4      NaN
#2          C         4           3      NaN