2017-04-12 3 views
0

に異なる重複インデックスを維持することにより、異なる列を生成し、私はこのようになりますDATAFRAMEを考えてみましょう:は、データフレーム

 D1  
0 2827 
1 2861 
2 2861 
3 2861 
4 2861 
5 2177 
6 2113 
7 2113 
8 2711 
9 2067 
10 2067 
11 2067 
12 2957 
13 2407 
14 2893 

その後、私は重複を置き換えるデータフレームの列のすべての異なる組み合わせを持っていると思います文字列 "空白"とユニークなままにしてください。

データフレームには9つの一意の値しかないため、6つの重複は空白にする必要があります。私は組み合わせ期待する出力として

:そのインデックスを維持しながら、ブランキングのすべての組み合わせまで

 D1  
0 2827 
1 2861 
2 "blank" 
3 "blank" 
4 "blank" 
5 2177 
6 2113 
7 "blank" 
8 2711 
9 2067 
10 "blank" 
11 "blank" 
12 2957 
13 2407 
14 2893 

と別の組み合わせを...

D1  
0 2827 
1 "blank" 
2 2861 
3 "blank" 
4 "blank" 
5 2177 
6 "blank 
7 2113 
8 2711 
9 "blank" 
10 2067 
11 "blank" 
12 2957 
13 2407 
14 2893 

は、作られています。

ありがとうございます!

+1

(コード:あなたは、文字列に「ブランク」交換を必要とするため、全体の列が(つまり、オブジェクト)の文字列に変換する必要があります)あなたの問題を解決する。問題は何ですか? – scienceisthenewblack

答えて

0

groupbyのcumcountを考慮し、条件付きで(numpyのwhereを使用)、ゼロより高い値を更新します。ノートの操作を行います。

import pandas as pd 
import numpy as np  
from itertools import permutations 
from functools import reduce 
from io import StringIO 

text=""" 
    D1 
0 2827 
1 2861 
2 2861 
3 2861 
4 2861 
5 2177 
6 2113 
7 2113 
8 2711 
9 2067 
10 2067 
11 2067 
12 2957 
13 2407 
14 2893""" 

df = pd.read_csv(StringIO(text), sep="\s+") 

# BUILDS LIST OF SERIES FROM EACH COLUMN OF DATAFRAME 
df['Cnt'] = df.groupby(['D1']).cumcount() 
df['MaxCnt'] = df.groupby(['D1'])['Cnt'].transform(max) 

combfactor = reduce(lambda x,y: x*y, df.groupby(['D1'])['Cnt'].transform('count').unique()) 

# RETRIEVE COMBINATIONS FOR EACH GROUP 
def createcombs(grp):  
    perms = list(permutations(df[df['D1']==grp]['Cnt'].tolist(), 
           len(df[df['D1']==grp]['Cnt'].tolist())))   
    perms = int(round(combfactor/len(perms),0)) * perms 

    return pd.DataFrame(list(zip(*perms))) 

df = df.join(pd.concat([createcombs(g) for g in df['D1'].unique()], ignore_index=True))  

# COLUMN BINDS INTO NEW DATAFRAME 
serlist = [pd.Series(np.where((df[i] != j) & (df['MaxCnt']!=0), '"blank"', df['D1'].astype(str)), 
        name='D1_'+str(i+1)) for i,j in list(zip(range(combfactor), 
                combfactor*list(range(max(df['Cnt'])+1))))]  

newdf = pd.concat(serlist, axis=1, keys=[s.name for s in serlist]) 

出力あなたの試みを含める必要があります

print(newdf) 

#  D1_1  D1_2  D1_3  D1_4  D1_5  D1_6  D1_7  D1_8 \ 
# 0  2827  2827  2827  2827  2827  2827  2827  2827 
# 1  2861 "blank" "blank" "blank"  2861 "blank" "blank" "blank" 
# 2 "blank"  2861  2861 "blank" "blank" "blank" "blank" "blank" 
# 3 "blank" "blank" "blank"  2861 "blank" "blank"  2861  2861 
# 4 "blank" "blank" "blank" "blank" "blank"  2861 "blank" "blank" 
# 5  2177  2177  2177  2177  2177  2177  2177  2177 
# 6  2113  2113 "blank" "blank"  2113  2113 "blank" "blank" 
# 7 "blank" "blank" "blank" "blank" "blank" "blank" "blank" "blank" 
# 8  2711  2711  2711  2711  2711  2711  2711  2711 
# v9  2067 "blank" "blank" "blank" "blank" "blank" "blank" "blank" 
# 10 "blank" "blank" "blank" "blank"  2067  2067 "blank" "blank" 
# 11 "blank"  2067  2067 "blank" "blank" "blank"  2067 "blank" 
# 12  2957  2957  2957  2957  2957  2957  2957  2957 
# 13  2407  2407  2407  2407  2407  2407  2407  2407 
# 14  2893  2893  2893  2893  2893  2893  2893  2893 

#  D1_9 D1_10 ...  D1_15 D1_16 D1_17 D1_18 D1_19 \ 
# 0  2827  2827 ...  2827  2827  2827  2827  2827 
# 1 "blank"  2861 ...  2861 "blank" "blank" "blank" "blank" 
# 2 "blank" "blank" ...  "blank" "blank" "blank" "blank" "blank" 
# 3  2861 "blank" ...  "blank"  2861  2861  2861 "blank" 
# 4 "blank" "blank" ...  "blank" "blank" "blank" "blank"  2861 
# 5  2177  2177 ...  2177  2177  2177  2177  2177 
# 6  2113  2113 ...  "blank" "blank"  2113  2113 "blank" 
# 7 "blank" "blank" ...  "blank" "blank" "blank" "blank" "blank" 
# 8  2711  2711 ...  2711  2711  2711  2711  2711 
# 9 "blank"  2067 ...  "blank" "blank" "blank" "blank" "blank" 
# 10  2067 "blank" ...  "blank" "blank"  2067  2067 "blank" 
# 11 "blank" "blank" ...  2067 "blank" "blank" "blank"  2067 
# 12  2957  2957 ...  2957  2957  2957  2957  2957 
# 13  2407  2407 ...  2407  2407  2407  2407  2407 
# 14  2893  2893 ...  2893  2893  2893  2893  2893 

#  D1_20 D1_21 D1_22 D1_23 D1_24 
# 0  2827  2827  2827  2827  2827 
# 1  2861 "blank" "blank" "blank"  2861 
# 2 "blank" "blank"  2861  2861 "blank" 
# 3 "blank"  2861 "blank" "blank" "blank" 
# 4 "blank" "blank" "blank" "blank" "blank" 
# 5  2177  2177  2177  2177  2177 
# 6 "blank"  2113  2113 "blank" "blank" 
# 7 "blank" "blank" "blank" "blank" "blank" 
# 8  2711  2711  2711  2711  2711 
# 9 "blank" "blank"  2067  2067 "blank" 
# 10 "blank"  2067 "blank" "blank" "blank" 
# 11 "blank" "blank" "blank" "blank" "blank" 
# 12  2957  2957  2957  2957  2957 
# 13  2407  2407  2407  2407  2407 
# 14  2893  2893  2893  2893  2893 

# [15 rows x 24 columns] 
+0

ありがとう、それは重複をカバーする別の "ブランク"の1つの組み合わせですが、同じ列の重複をカバーするブランクの次の組み合わせは、投稿した2番目の出力です。例:インデックス1は現在「空」であり、インデックス2は数字を有し、3および4は再び「空白」である。次の組み合わせでは、インデックス1と2に「空白」、3には数字、4の「空白」などが表示されます。これにより、倍率をカバーする4 * 2 * 3 = 24の空白の組合せが得られます。私の説明が少しはっきりしていることを望みますか? :) – Ward

+0

'itertools'と' functools'を各グループの組み合わせとしてインポートしなければならなかったupdateを参照して、* blanks *に対して繰り返されるよりも元のデータフレームに連結されます。より大きいセット* 2861 *のすべての24個の櫛に到達すると、いくつかの列でグループ化するために、すべての*ブランク*を持つ他のより小さい番号のグループが生成されます。すごい!妻と子供に教えてください。何も簡単なことはありません! – Parfait

+0

うわー、難しい問題!私は妻に話します、彼女は私がこの問題を整理するすべての夕方を過ごさなかったことを喜ぶでしょう)。再度、感謝します! – Ward

関連する問題