2017-10-13 5 views
1

以下のデータポイントを持つDataFrameがあります。ここでcountはarticleTagが読み取られた回数を表します。 articleTagはarticleIdのtagです。すなわち、記事ID 590020には、1つの文字列として表される4つのタグA,B,C,Dがある。カウント回数Stringの一部がDataFrameです

 articleId  articleTag  count 
    0  590020  A,B,C,D    2 
    1  466322  A,B,E    3 
    2  466322  B     2 
    3  466322  A     1 

私は倍の多くの数は、それが記事に登場し、何回その読み取りの数どのように各タグのtag distributionすなわちを確認する必要があります。

上記のサンプルデータフレームに似ています。

Tag  Present  Read 
A   3   6 
B   3   7 
C   1   2 
D   1   2 
E   1   3 

P1のヘルプ。

答えて

1

あなたはこのような何かを行うことができます:

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([{"articleId": 590020, "articleTag": "A,B,C,D ", "count": 6}, {"articleId": 590021, "articleTag": "A,B,E", "count": 3}]) 

In [3]: df[df.articleTag.str.contains("A")]['count'].sum() 
Out: 9 

In [4]: len(df[df.articleTag.str.contains("A")]) 
Out[4]: 2 

最初にあなたの「読み」の値であり、第二は、あなたの「現在」の値です。

すべての様々なタグを見つけるために、私はおそらくこのような何かしたい:

In [5]: tag_df = df.articleTag.str.split(',', expand=True) 

In [6]: for column in tag_df.columns: 
...:  print(tag_df[column].unique()) 
...:  
...:  
['A'] 
['B'] 
['C' 'E'] 
['D ' None] 

の代わりにそれらを印刷し、あなたはsetにそれらを追加し、あなたはその方法を探すために必要なすべてのタグを収集することができます。

In [7]: unique_tags = set() 

In [8]: for column in tag_df.columns: 
    ...:  unique_tags |= set(tag_df[column].unique()) 
    ...:  
    ...:  
    ...:  
    ...:  

In [9]: unique_tags 
Out[9]: {'B', 'A', 'C', 'E', None, 'D '} 

もちろん、Noneの値を引き出す必要があります。

1
df = pd.DataFrame([{"articleId": 590020, "articleTag": "A,B,C,D ", "count": 2}, 
        {"articleId": 590021, "articleTag": "A,B,E", "count": 3}, 
        {"articleId": 466322, "articleTag": "B", "count": 2}, 
        {"articleId": 466322, "articleTag": "A", "count": 1}]) 
articles = [] 
for val in df['articleTag'].values: 
    articles.extend(val.split(',')) 
unique_articles = list(set(articles)) 

final_dict = {} 
final_dict['article'] = unique_articles 
final_count = [] 
final_read = [] 
for article in unique_articles: 
     l = [val for val in df['articleTag'].values if article in val] 
     l2 = [val[1] for val in zip(df['articleTag'].values,df['count'].values) if article in val[0]] 
     final_read.append(sum(l2)) 
     final_count.append(len(l)) 
final_dict['Present'] = final_count 
final_dict['Read'] = final_read 
pd.DataFrame(final_dict) 
+0

上記のコードでは、文字列の一部も考慮されています。例えば、タグが読み込みカウントが計算されるべき「naren」である場合。したがって、もしそれが 'narendra modi、bjp'に対してテストされれば、そのカウントは増分されます。しかし、私はこれを望んでいません。タグは全体として存在する必要があります。 –

+0

'='の代わりに==を使用する –

関連する問題