根据另一列提取列值,读取多个文件

时间:2019-10-30 06:56:33

标签: python pandas dataframe

我想从基于Name,Grade,School,Class的值中提取值。 例如,如果要查找“名称”和“等级”,我想遍历第0列并在接下来的几列中找到值,但是该值分散(要提取)在下一列周围。学校和班级也是如此。

请参阅:extract column value based on another column pandas dataframe

我有多个文件:

      0      1     2     3      4     5    6    7     8
0    nan    nan  nan  Student Registration   nan    nan
1    Name:   nan  nan   John   nan   nan  nan  nan   nan
2    Grade:  nan   6    nan    nan   nan  nan  nan   nan
3     nan    nan  nan  School: C College  nan  Class: 1A               

      0      1     2     3      4     5    6    7     8    9
0    nan    nan   nan  Student Registration     nan  nan  nan
1     nan    nan  nan    nan   nan    nan  nan   nan nan  nan
2    Name: Mary   nan    nan   nan    nan  nan   nan nan nan
3    Grade:   7   nan    nan   nan    nan  nan   nan nan nan
4     nan   nan   nan  School: nan   D College Class: nan 5A     

这是我的代码:(错误)

for file in files:
       df = pd.read_csv(file,header=0)
       df['Name'] = df.loc[df[0].isin('Name')[1,2,3]
       df['Grade'] = df.loc[df[0].isin('Grade')[1,2,3]
       df['School'] = df.loc[df[3].isin('School')[4,5]
       df['Class'] = df.loc[df[7].isin('Class')[8,9]
       d.append(df)
df = pd.concat(d,ignore_index=True)

这是我想要的结果:(融化功能)

Name Grade  School    Class ... .... ... ... 
John  6    C College   1A
John  6    C College   1A
John  6    C College   1A
John  6    C College   1A
Mary  7    D College   5A
Mary  7    D College   5A
Mary  7    D College   5A
Mary  7    D College   5A

1 个答案:

答案 0 :(得分:1)

我认为这里可以使用:

for file in files:
    df = pd.read_csv(file,header=0)
    #filter out first column and reshape - removed NaNs, convert to 1 column df
    df = df.iloc[1:].stack().reset_index(drop=True).to_frame('data')
    #compare by :
    m = df['data'].str.endswith(':', na=False)
    #shift values to new column
    df['val'] = df['data'].shift(-1)
    #filter and transpose
    df = df[m].set_index('data').T.rename_axis(None, axis=1)
    d.append(df)
df = pd.concat(d,ignore_index=True)

编辑:

您可以使用:

for file in files:
    #if input are excel, change read_csv  to read_excel
    df = pd.read_excel(file, header=None)

    df['Name'] = df.loc[df[0].eq('Name:'), [1,2,3]].dropna(axis=1).squeeze()
    df['Grade'] = df.loc[df[0].eq('Grade:'), [1,2,3]].dropna(axis=1).squeeze()
    df['School'] = df.loc[df[3].eq('School:'), [4,5]].dropna(axis=1).squeeze()
    df['Class'] = df.loc[df[6].eq('Class:'), [7,8]].dropna(axis=1).squeeze()

    print (df)
相关问题