Парсинг таблицы (общие, различающиеся и пустые данные)

Представим у нас есть таблица в файле .csv

(данные взял тестовые, для удобства и человекочитаемости)

ID 234522 524321 234956 234983 293853
фамилия Иванов Тарасова Петров Кузнецова Пушкин
пол мужской женский мужской женский мужской
год рождения 1965 1999 1984 1979 2001
должность инженер инженер инженер инженер инженер
количество детей 2 1 3
телефон 7485 3310 6500
офис центральный центральный центральный центральный центральный
почта [email protected] [email protected] [email protected]

Нужно обработать эти данные:

1 разделить изменяемые и неизменяемые данные:

Неизменяемые данные:

ключ значение
должность инженер
офис центральный

изменяемые данные:

ID 234522 524321 234956 234983 293853
фамилия Иванов Тарасова Петров Кузнецова Пушкин
пол мужской женский мужской женский мужской
год рождения 1965 1999 1984 1979 2001
количество детей 2 1 3
телефон 7485 3310 6500
почта [email protected] [email protected] [email protected]

2 Разделить пустые и не пустые данные:

пустые данные (строки, в которые есть пустые данные, кроме столбцов, в которых пустые данные отсутствуют)

ID 524321 234956 234983 293853
количество детей 1 3
телефон 3310 6500
почта [email protected] [email protected]

Непустые данные (только строки):

ID 234522 524321 234956 234983 293853
фамилия Иванов Тарасова Петров Кузнецова Пушкин
пол мужской женский мужской женский мужской
год рождения 1965 1999 1984 1979 2001
должность инженер инженер инженер инженер инженер
офис центральный центральный центральный центральный центральный

Хочу их разделить используя pandas, помогите с решением, пожалуйста


Ответы (1 шт):

Автор решения: strawdog

Это, вообще-то, простые задачи.

unmutable_data = ["должность", "офис"]
print(df.loc[df["ID"].isin(unmutable_data)])
print(df.loc[~df["ID"].isin(unmutable_data)])
print(df.loc[df.isnull().any(axis=1)])
print(df.loc[~df.isnull().any(axis=1)])
          ID       234522       524321       234956       234983       293853
3  должность      инженер      инженер      инженер      инженер      инженер
6       офис  центральный  центральный  центральный  центральный  центральный
                 ID          234522            524321          234956     234983   293853
0           фамилия          Иванов          Тарасова          Петров  Кузнецова   Пушкин
1               пол         мужской           женский         мужской    женский  мужской
2      год рождения            1965              1999            1984       1979     2001
4  количество детей               2                 1             NaN          3      NaN
5           телефон            7485               NaN            3310       6500      NaN
7             почта  [email protected]  [email protected]  [email protected]        NaN      NaN
                 ID          234522            524321          234956 234983 293853
4  количество детей               2                 1             NaN      3    NaN
5           телефон            7485               NaN            3310   6500    NaN
7             почта  [email protected]  [email protected]  [email protected]    NaN    NaN
             ID       234522       524321       234956       234983       293853
0       фамилия       Иванов     Тарасова       Петров    Кузнецова       Пушкин
1           пол      мужской      женский      мужской      женский      мужской
2  год рождения         1965         1999         1984         1979         2001
3     должность      инженер      инженер      инженер      инженер      инженер
6          офис  центральный  центральный  центральный  центральный  центральный

если unmutable_data нужно вычислить на основании полученных данных, то можно либо так:

unmutable_data = df[df.iloc[:, 2:].eq(df.iloc[:,2], axis=0).all(1)]["ID"]

либо так:

unmutable_data = df.loc[df.iloc[:,2:].nunique(axis=1)==1, "ID"]

UPDATE Если датафрейм имеет в качестве индекса колонку "ID", то код будет выглядеть так:

unmutable_data = df[df.iloc[:, 1:].eq(df.iloc[:,1], axis=0).all(1)].index
# либо
# unmutable_data = df.loc[df.iloc[:,1:].nunique(axis=1)==1].index
# здесь выводим только ключ и значение
print(df.iloc[:, :1].loc[df.index.isin(unmutable_data)])
print(df.loc[~df.index.isin(unmutable_data)])
print(df.loc[df.isnull().any(axis=1)])
print(df.loc[~df.isnull().any(axis=1)])
→ Ссылка