我正在寻求以下方面的帮助。
假设我有一个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以外的其他条件创建记录。
任何帮助都非常感激。
答案 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