Парсинг таблицы (общие, различающиеся и пустые данные)
Представим у нас есть таблица в файле .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 шт):
Это, вообще-то, простые задачи.
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)])