简体   繁体   中英

How to Groupby columns(ignore order) in Pandas DataFrame?

I have a pandas dataframe(4 of 8 columns):

df = pd.DataFrame( {"departure_country":["Mexico","Mexico","United States","United States","United States","United States","Japan","United States","United States","United States"],"departure_city":["Guadalajara","Guadalajara","New York","Chicago","Los Angeles","Michigan","Tokyo","New York","New York","Chicago"],"destination_country":["United States","United States","United States","United States","Mexico","United States","United States","Mexico","United States","Japan"],"destination_city":["Los Angeles","Los Angeles","Chicago","New York","Guadalajara","New York","Chicago","Guadalajara","Michigan","Tokyo"]})

df
    departure_country   departure_city  destination_country destination_city
0   Mexico              Guadalajara     United States       Los Angeles
1   Mexico              Guadalajara     United States       Los Angeles
2   United States       New York        United States       Chicago
3   United States       Chicago         United States       New York
4   United States       Los Angeles     Mexico              Guadalajara
5   United States       Michigan        United States       New York
6   Japan               Tokyo           United States       Chicago
7   United States       New York        Mexico              Guadalajara
8   United States       New York        United States       Michigan
9   United States       Chicago         Japan               Tokyo

I want to analyze the data in each group so I would like to groupby "the same pair" of departure and destination first, something like:

    departure_country   departure_city  destination_country destination_city
0   Mexico              Guadalajara     United States       Los Angeles
1   Mexico              Guadalajara     United States       Los Angeles
2   United States       Los Angeles     Mexico              Guadalajara
3   United States       New York        United States       Chicago
4   United States       Chicago         United States       New York
5   United States       Michigan        United States       New York
6   United States       New York        United States       Michigan
7   Japan               Tokyo           United States       Chicago
8   United States       Chicago         Japan               Tokyo
9   United States       New York        Mexico              Guadalajara

Is it possible to make it in a DataFrame? I have tried groupby and key-value, but I failed. Really appreciate your help with this, thanks!

I'm sure someone could think of a better optimized solution, but one way is to create sorted tuples of your country/city pairs and sort by it:

print (df.assign(country=[tuple(sorted(i)) for i in df.filter(like="country").to_numpy()],
                 city=[tuple(sorted(i)) for i in df.filter(like="city").to_numpy()])
         .sort_values(["country","city"], ascending=False).filter(like="_"))

  departure_country departure_city destination_country destination_city
5     United States       Michigan       United States         New York
8     United States       New York       United States         Michigan
2     United States       New York       United States          Chicago
3     United States        Chicago       United States         New York
7     United States       New York              Mexico      Guadalajara
0            Mexico    Guadalajara       United States      Los Angeles
1            Mexico    Guadalajara       United States      Los Angeles
4     United States    Los Angeles              Mexico      Guadalajara
6             Japan          Tokyo       United States          Chicago
9     United States        Chicago               Japan            Tokyo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM