#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я довольно новичок в pandas, и я пробовал несколько решений этой проблемы, используя логику dataframe.merge
и lambda
, но мне не удалось найти решение, которое последовательно приводит к тому, что я ищу. После фильтрации некоторых данных с помощью
df = df.groupby(['0', '1']).size()
df = df.to_frame(name='2').reset_index()
Я получаю следующую таблицу, первые два столбца представляют начальную и конечную точки соответственно, а третий представляет количество раз, которое оно повторялось до groupby
:
0 1 2
a d 8
b h 7
c f 3
c e 3
d a 2
b b 2
e c 1
f c 1
g i 1
h b 1
i g 1
Мне нужно учитывать как начальные, так и конечные точки> start, что означает, что следующий фрейм данных:
0 1 2
a d 8
d a 2
должно закончиться так:
0 1 2
a d 10
И вернемся к исходной таблице, которая должна выглядеть следующим образом:
0 1 2
a d 10
b h 8
c f 4
c e 4
b b 2
g i 2
Я уверен, что это должно быть простым решением, но, хоть убейте, я просто не могу точно определить ответ.
Ответ №1:
Вы можете сделать это следующим образом:
df1 = df[['0', '1']].apply(sorted, 1, result_type = "expand").rename(columns = {0:'col1', 1:'col2'})
result = df.groupby([df1.col1, df1.col2]).sum().reset_index()
Комментарии:
1. Привет! Это тоже работает! Мне также было легче понять (или, по крайней мере, мне хотелось бы так думать), также как и ответ Андерсона, это не фильтровало бы, если бы они были
int
вместе сstr
записями. Я мог бы легко исправить это, добавивastype(str)
вот так:df1 = result_co[['Connector 1', 'Connector 2']].astype(str).apply(sorted, 1, result_type="expand").rename(columns={0: 'col1', 1: 'col2'})
2. Рад, что это помогло!
Ответ №2:
Один из вариантов — использовать apply
для сортировки значений в столбцах, затем выполнить другой groupby
(обратите внимание, что имена ваших столбцов могут отличаться, мое df
было сделано с использованием pd.read_clipboard()
)
df.reset_index(inplace=True)
df[['0','1']]=df[['0','1']].apply(lambda x:sorted(x),axis=1).tolist()
df
0 1 2
0 a d 8
1 b h 7
2 c f 3
3 c e 3
4 a d 2
5 b b 2
6 c e 1
7 c f 1
8 g i 1
9 b h 1
10 g i 1
df.groupby(['0','1'], as_index=False).sum()
0 1 2
0 a d 10
1 b b 2
2 b h 8
3 c e 4
4 c f 4
5 g i 2
Комментарии:
1. Извините, если ответ занял некоторое время. Это действительно сработало! однако я столкнулся с небольшой проблемой, если есть какие-либо записи с номером (который pandas читает как
int
), он не будет фильтроваться. Скажем, вместо a -> d это 18 -> b или иногда это может переходить от числа к числу, например 15 -> 4.