データフレームを3つの新しいデータフレームに分割しようと苦労しています。この場合、サプライヤ名が変更されたときに分割が発生します。既存の質問を検索しました。列の行とパンダとPythonに基づいてデータフレームを分割する方法:部分文字列を含む列の値に基づいてデータフレームを多くのデータフレームに分割する方法が近づきましたが、必要な出力を取得できません。
ここに私の問題を説明するためのおもちゃのデータセットが添付されています:
df = pd.DataFrame({'Supplier': ['Supplier1', 'Supplier1', 'Supplier2', 'Supplier2', 'Supplier2', 'Supplier3','Supplier3'], 'Class' : ['A', 'A','A','A','A','B','B']})
そして私は(失敗して)試しました
df1 = df.iloc[:df.index[df['Supplier'] == 'Supplier1'].tolist()[0]]
df2 = df.iloc[df.index[df['Supplier'] == 'Supplier2'].tolist()[0]+1:]
df3 = df.iloc[df.index[df['Supplier'] == 'Supplier3'].tolist()[0]+1:]
私が達成しようとしている結果は次のとおりです。
Supplier Class
0 Supplier1 A
1 Supplier1 A
Supplier Class
0 Supplier2 A
1 Supplier2 A
2 Supplier2 A
Supplier Class
0 Supplier3 B
1 Supplier3 B
これに関するどんな助けでも大いに感謝されるでしょう。ありがとうございました!
更新:使用:
df1 = {i:group for i,group in df.groupby( df['Supplier'].ne(df['Supplier'].shift()).cumsum() )}
与える:
{1: Supplier Class
0 Supplier1 A
1 Supplier1 A, 2: Supplier Class
2 Supplier2 A
3 Supplier2 A
4 Supplier2 A, 3: Supplier Class
5 Supplier3 B
6 Supplier3 B}
別々のデータフレームに分割する必要があるので、次のようにしました。
df3 = pd.DataFrame.from_dict({i:group for i,group in df1.groupby(df1['Supplier'].ne(df1['Supplier'].shift()).cumsum() )},orient='index', columns= ['Class'])
しかし、それはエラーを与えます
df3 = pd.DataFrame.from_dict({i:group for i,group in df1.groupby(df1['Supplier'].ne(df1['Supplier'].shift()).cumsum() )},orient='index', columns= ['Class'])
AttributeError: 'dict' object has no attribute 'groupby'
これにより、必要な分割が実現すると思います。
groups = [group.reset_index()[['Supplier', 'Class']] for _, group in df.groupby('Supplier')]
あなたはあなたの例の正確な出力をで得ることができます
for group in groups:
print(group)
出力:
Supplier Class
0 Supplier1 A
1 Supplier1 A
Supplier Class
0 Supplier2 A
1 Supplier2 A
2 Supplier2 A
Supplier Class
0 Supplier3 B
1 Supplier3 B
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加