试着转一转,但不是真的?

2024-05-13 21:59:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一些数据:

Data = {'codes': ['123456', '789654789', '789654789', '54126', '123456'],    
        'names': ['google.com', 'reddit.com', 'bbc.com', 'google.com', 'google.com']
        }
df = pd.DataFrame(Data, columns = ['codes','names'])

我期望的结果是:


Data = {'codes': ['123456', '789654789', '54126'],    
        'names': ['(2)google.com', '(1)reddit.com|(1)bbc.com', '(1)google.com']
        }



df = pd.DataFrame(Data, columns = ['codes','names'])

我的想法是不为每个代码/域组合指定行,而只是在第一列中保留唯一的代码,并在第二列中放置一个字符串,它将说明与它相关的特定域的manny条目以及在同一字符串中用逗号分隔的所有域。 现在我正在使用一个列表“df.codes.unique()”,并将其放入循环中,并在该循环中构造一个字符串。一旦我以一个代码结束,然后我继续到另一个代码,再到同一个代码。我有数百万行,这种方法非常慢。有什么有效的方法吗


Tags: columns数据方法字符串代码comdataframedf
2条回答
Data = {'codes': ['123456', '789654789', '789654789', '54126', '123456'],
        'names': ['google.com', 'reddit.com', 'bbc.com', 'google.com', 'google.com']
        }
df = pd.DataFrame(Data, columns = ['codes','names'])

df=df.groupby(df.columns.tolist()).size().reset_index().rename(columns={0:'count'})
df['count']=df['count'].astype(str)+' '+df['names']
df = df.sort_values('names') .groupby('codes', sort=False)['count'].agg(lambda x: ','.join(x.astype(str))).reset_index()
print(df)
       codes                   count
0  789654789  1 bbc.com,1 reddit.com
1     123456            2 google.com
2      54126            1 google.com

首先使用crosstab进行计算,然后将非零和与列名连接起来。最后一行只是根据您的问题将结果序列转换为数据帧:

ct = pd.crosstab(df.codes, df.names)
result = ct.apply(lambda row: '|'.join(list(filter(None,map((lambda value,colName: '({}){}'.format(value, colName) if value > 0 else ''), row, ct.columns.values)))), axis = 1)
res_df = result.reset_index().rename(columns = {0: 'names'})

结果如下:

       codes                     names
0     123456             (2)google.com
1      54126             (1)google.com
2  789654789  (1)bbc.com|(1)reddit.com

相关问题 更多 >