Как поменять местами значения столбцов, используя условие, в котором значения содержат часть строки, используя python - PullRequest
0 голосов
/ 13 июля 2020

У меня большой набор данных около 300 строк. У меня есть данные в неправильных столбцах. Я пробовал np.where, но, похоже, не понял.

   A      B      C
1  AD75   5222   CD56
2  CD45   5233   AD58
3  5267   CD45   AD55
4  5200   AD45   CD46

желаемый результат

    A      B      C
1  AD75   5222   CD56
2  AD58   5233   CD45
3  AD55   5267   CD45
4  AD45   5200   CD46

Столбец A должен иметь значения, начинающиеся с AD, столбец B должен чтобы иметь значение int, а col C должен иметь значения, начинающиеся с CD

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Я считаю, что для этого требуется индивидуальный анализ, это был бы мой подход:

list_A = [[x for x in y if str(x).startswith('A')][0] for y in df.values]
list_B = [[x for x in y if type(x) == int][0] for y in df.values]
list_C = [[x for x in y if str(x).startswith('C')][0] for y in df.values]
df['A'] = list_A
df['B'] = list_B
df['C'] = list_C

Вывод:

      A     B     C
0  AD75  5222  CD56
1  AD58  5233  CD45
2  AD55  5267  CD45
3  AD45  5200  CD46
1 голос
/ 13 июля 2020

Вы можете сделать:

# you can sort the rows
df2 = df.apply(sorted, 1).to_frame()[0].apply(pd.Series)

# set column names
df2.columns = ['B','A', 'C']
cols = sorted(df2.columns)

df2 = df2[cols]
print(df2)

      A     B     C
1  AD75  5222  CD56
2  AD58  5233  CD45
3  AD55  5267  CD45
4  AD45  5200  CD46
0 голосов
/ 13 июля 2020

Я не уверен, при каких условиях вы хотите поменять местами значения в столбцах. Я предполагаю, что всякий раз, когда столбец B выглядит как целое число, вы хотите поменять местами:

import pandas as pd
df = pd.read_clipboard()
print(df)
# swap integers into column B
ind = ~df['B'].str.match("\d+")
df.loc[ind, ['A', 'B']] = df.loc[ind, ['B', 'A']].values
# swap strings starting with "AB" into column A
ind = ~df['A'].str.match("^AD")
df.loc[ind, ['A', 'C']] = df.loc[ind, ['C', 'A']].values

print(df)

Это дает:

      A     B     C
1  AD75  5222  CD56
2  CD45  5233  AD58
3  5267  CD45  AD55
4  5200  AD45  CD46

      A     B     C
1  AD75  5222  CD56
2  AD58  5233  CD45
3  AD55  5267  CD45
4  AD45  5200  CD46
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...