所有结果都没有求助

时间:2018-05-26 11:16:36

标签: pandas

在groupby中排序不像我想象的那样工作。 在下面的示例中,我不想将" USA"因为有一排"俄罗斯"。

from io import StringIO

myst="""india, 905034 , 19:44   
USA, 905094  , 19:33
Russia,  905154 ,   21:56
USA, 345345, 45:55
USA, 34535, 65:45
"""
u_cols=['country', 'index', 'current_tm']

myf = StringIO(myst)
import pandas as pd
df = pd.read_csv(StringIO(myst), sep=',', names = u_cols)

当我使用groupby时,我得到以下内容:

df.groupby('country', sort=False).size()

country
india     1
USA       3
Russia    1
dtype: int64

无论如何,我可以得到类似的结果......

country
india     1
USA       1
Russia    1
USA       2

2 个答案:

答案 0 :(得分:4)

你可以试试这段代码而不是直接的groupby:

country = [] #initialising lists
count = []
for i, g in df.groupby([(df.country != df.country.shift()).cumsum()]): #Creating a list that increases by 1 for every time a unique value appears in the dataframe country column.
    country.append(g.country.tolist()[0]) #Adding the name of country to list.
    count.append(len(g.country.tolist())) #Adding the number of times that country appears to list.

pd.DataFrame(data = {'country': country, 'count':count}) #Binding the lists all into a dataframe.

df.groupby([(df.country != df.country.shift()).cumsum()])会创建一个数据框,为国家/地区列中的每个国家/地区更改提供唯一编号(累计)。

在for循环中,i表示分配给每个国家/地区外观的唯一累积数字,g表示原始数据框中的相应完整行。

g.country.tolist()输出每个独特外观的国家名称列表(又名i),即

['india']
['USA']
['Russia']
['USA', 'USA']

用于您的给定数据。

因此,第一项是国家名称,长度代表出现次数。然后可以将此信息(记录在列表中然后)放在一起放入数据帧并提供所需的输出。

您还可以使用列表推导而不是for循环:

cumulative_df = df.groupby([(df.country != df.country.shift()).cumsum()]) #The cumulative count dataframe
country = [g.country.tolist()[0]  for i,g in  cumulative_df] #List comprehension for getting country names.
count = [len(g.country.tolist())  for i,g in  cumulative_df] #List comprehension for getting count for each country.

参考:Pandas DataFrame: How to groupby consecutive values

答案 1 :(得分:2)

使用@ user2285236评论中给出的技巧

df['Group'] = (df.country != df.country.shift()).cumsum()
df.groupby(['country', 'Group'], sort=False).size()