0
df3=pd.DataFrame({'col1':['a','b','c','d','a'],
                    'col2':['b','a','a','c','c'],
                     })
df3['col3']=df3['col1']+df3['col2']

和数据框将是这样的

  col1 col2 col3
0   a   b   ab
1   b   a   ba
2   c   a   ca
3   d   c   dc
4   a   c   ac

如果 ab=ba 我想要 ba, ca to ab, ac 这样

  col1 col2 col3
0   a   b   ab
1   b   a   ab
2   c   a   ac
3   d   c   dc
4   a   c   ac

感谢您的帮助我可以添加更多问题吗?

df3=pd.DataFrame({'col1':['banana','apple','pie','mango','cola'],
                    'col2':['apple','banana','mango','cola','mango'],
                     })
df3['col3']=df3['col1']+df3['col2']

结果

    col1    col2    col3
0   banana  apple   bananaapple
1   apple   banana  applebanana
2   pie     mango   piemango
3   mango   cola    mangocola
4   cola    mango   colamango

改变

col1    col2    col3
0   banana  apple   bananaapple
1   apple   banana  bananaapple
2   pie     mango   piemango
3   mango   cola    mangocola
4   cola    mango   mangocola

我想做的是过滤如果 ab=ba 更改为 ab

4

4 回答 4

1

如果保持第一个键的顺序很重要,下面是一个可行的解决方案:

df3.join(df3.groupby(df3.apply(frozenset, axis=1)) # use a frozenset a key for uniqueness
            # below to craft a custom transform by using the first row per group
            .apply(lambda g: pd.Series([''.join(g.iloc[0])]*len(g),
                                       name='col3',
                                       index=g.index,
                                      ))
            .droplevel(0)
        )

输出:

  col1 col2 col3
0    a    b   ab
1    b    a   ab
2    c    a   ca
3    d    c   dc
4    a    c   ca
于 2021-09-17T13:59:29.783 回答
0

像这样的东西应该可以工作,我们可以使用.stack,.sort_values().groupby

import numpy as np
df3['col3'] = np.where(df3['col3'].str.contains('a'),
                       df3[['col1','col2']].stack().sort_values(
                                           ).groupby(level=0).agg(''.join),
                       df3['col3'])

print(df3)

 col1 col2 col3
0    a    b   ab
1    b    a   ab
2    c    a   ac
3    d    c   dc
4    a    c   ac
于 2021-09-17T13:49:55.520 回答
0

您可以使用apply生成 col3str.joinsorted确保字母的顺序一致:

df3['col3'] = df3.apply(lambda r: ''.join(sorted(r)), axis=1)

输出:

  col1 col2 col3
0    a    b   ab
1    b    a   ab
2    c    a   ac
3    d    c   cd
4    a    c   ac
于 2021-09-17T13:45:03.643 回答
0

这个怎么样?

df3['col3'] = np.where(df3['col2']=='a', df3['col2']+df3['col1'], df3['col1']+df3['col2'])

或者也许是这样的:

df3['col3'] = [y+x if y == 'a' else x+y for x,y in zip(df3['col1'], df3['col2'])]

-=EDIT=- 如果我们不关心整个 cd/dc 问题,试试这个:

df3['col3'] = np.where(df3['col2']<=df3['col1'], df3['col2']+df3['col1'], df3['col1']+df3['col2'])

或者

df3['col3'] =[y+x if y <= x else x+y for x,y in zip(df3['col1'], df3['col2'])]
于 2021-09-17T13:47:56.397 回答