列の数値に基づいて既存のデータフレームを分解しようとしています。たとえば、列の数値が3の場合、これらの行を3つにしたい、というように続きます。
このデータフレームから始めると仮定します。
inventory_partner inventory_partner2 calc
0 A1 aa 1
1 A2 bb 2
2 A3 cc 5
3 A4 dd 4
4 A5 ee 5
5 A6 ff 3
このデータフレームに到達するにはどうすればよいですか?
inventory_partner inventory_partner2 calc
0 A1 aa 1
1 A2 bb 2
1 A2 bb 2
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
3 A4 dd 4
3 A4 dd 4
3 A4 dd 4
3 A4 dd 4
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
5 A6 ff 3
5 A6 ff 3
5 A6 ff 3
以下のコードを使用してこれを機能させることができましたが、explodeメソッドにフィードするためにコンマ区切りのリストを手動で作成しなくても、これを実現する簡単な方法があるかどうか疑問に思いました。
import pandas as pd
#create dataframe
d = {'inventory_partner': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'], 'inventory_partner2': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff'], 'calc': [1, 2, 5, 4, 5, 3]}
df1 = pd.DataFrame(data=d)
print(df1) #print original dataframe
#create my_comma_list column based on number values in calc column
df1.insert(3, 'my_comma_list', '')
df1.loc[df1['calc'] == 1, 'my_comma_list'] = '1'
df1.loc[df1['calc'] == 2, 'my_comma_list'] = '1, 2'
df1.loc[df1['calc'] == 3, 'my_comma_list'] = '1, 2, 3'
df1.loc[df1['calc'] == 4, 'my_comma_list'] = '1, 2, 3, 4'
df1.loc[df1['calc'] == 5, 'my_comma_list'] = '1, 2, 3, 4, 5'
print(df1) #print before row explosion
#explode the rows using the my_comma_list column to get desired number of rows
df1 = df1.assign(my_comma_list=df1['my_comma_list'].str.split(',')).explode('my_comma_list')
#drop the my_comma_list column since we no longer need it
del df1['my_comma_list']
print(df1) #print after row explosion
Index.repeatとDataFrame.locを使用して行を繰り返すことができます。
import pandas as pd
#create dataframe
d = {'inventory_partner': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
'inventory_partner2': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff'],
'calc': [1, 2, 5, 4, 5, 3]}
df1 = pd.DataFrame(data=d)
print (df1)
df1 = df1.loc[df1.index.repeat(df1['calc'])]
print (df1)
出力は次のとおりです。
元のDataFrame:
inventory_partner inventory_partner2 calc
0 A1 aa 1
1 A2 bb 2
2 A3 cc 5
3 A4 dd 4
4 A5 ee 5
5 A6 ff 3
繰り返される行でDataFrameを更新しました:
inventory_partner inventory_partner2 calc
0 A1 aa 1
1 A2 bb 2
1 A2 bb 2
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
3 A4 dd 4
3 A4 dd 4
3 A4 dd 4
3 A4 dd 4
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
5 A6 ff 3
5 A6 ff 3
5 A6 ff 3
参照ルックアップを使用して列の値に基づいて行を繰り返す場合は、ディクショナリを作成し、それを繰り返す回数を特定してから、mapを使用して値を渡すことができます。
たとえば、の値に基づいて繰り返したいとしinventory_partner
ます。次に、これを行うことができます:
import pandas as pd
inv_partner_dict = {'A1':1, 'A2':2, 'A3':5, 'A4':4,'A5':5,'A6':3}
#create dataframe
d = {'inventory_partner': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
'inventory_partner2': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff'],
'calc': [1, 2, 5, 4, 5, 3]}
df1 = pd.DataFrame(data=d)
print (df1)
df1 = df1.loc[df1.index.repeat(df1['inventory_partner2'].map(inv_partner_dict))]
print (df1)
これは同じことをします。
これの出力は次のようになります。
元のDataFrame:
inventory_partner inventory_partner2 calc
0 A1 aa 1
1 A2 bb 2
2 A3 cc 5
3 A4 dd 4
4 A5 ee 5
5 A6 ff 3
繰り返される行でDataFrameを更新しました:
inventory_partner inventory_partner2 calc
0 A1 aa 1
1 A2 bb 2
1 A2 bb 2
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
2 A3 cc 5
3 A4 dd 4
3 A4 dd 4
3 A4 dd 4
3 A4 dd 4
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
4 A5 ee 5
5 A6 ff 3
5 A6 ff 3
5 A6 ff 3
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加