Я немного новичок в этом. В настоящее время я экспериментирую с фреймами данных в python и в чем-то немного застрял. Мне нужно получить столбцы во фрейме данных, которые имеют одинаковую разницу между их уникальными отсортированными элементами. Я могу сделать это в автономном коде, но я хочу делать это динамически, получая его из фрейма данных в файле.

import numpy as np
import pandas as pd

first = [20, 10, 40, 30, 10]
sec = [94, 74, 34, 80]
df = pd.DataFrame([(first,sec) for first,sec in zip(first,sec)])
print(df)
cols = list(df.columns)
sorted_df = df.sort_values(by = cols, ascending = True)
print("sorted - \n", sorted_df)
all_unique = [sorted_df[col].unique() for col in cols]
print("UNIQUE:\n", all_unique)
diff = [np.diff(lst) for last in all_unique]
print("DIFF - \n", diff)

Я могу получить список списков различий. Теперь мне нужно проверить, все ли элементы в diff одинаковы, если да, то должен вернуть имя столбца, будь то первое или второе. Результат, который я получил:

   0   1
0  20  94
1  10  74
2  20  34
3  30  80
sorted - 
   0   1
0  20  94
1  10  74
2  20  30
3  30  80
UNIQUE:
[array([10, 20, 30]), array([74, 34, 94, 80])]
DIFF - 
[array([10, 10]), array([-40, 60, -14])]

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

output - ['first']
1
lilxy 24 Ноя 2021 в 09:13

1 ответ

Лучший ответ

Используйте понимание списка с тестом, если различия в отсортированных значениях уникальны:

#without unique values
output = [col for col in cols if df[col].sort_values().diff().nunique() == 1]
print("OUT - \n", output)
[0]

#with unique values
output = [col for col in cols 
          if df[col].drop_duplicates().sort_values().diff().nunique() == 1]

Или же:

output = [col for col in cols if np.unique(np.diff(np.unique(df[col]))).shape[0] == 1]
print("OUT - \n", output)
[0]
1
jezrael 24 Ноя 2021 в 10:05