データフレーム内リストの値に基づいて要素を複製

Pandas correct values in lists – StackOverflow

結局,Pandasの皮を被ったただのリストなので,ピュアに処理すれば良い.

import pandas as pd


def splitmax(df):
    d = {'pos': [], 'value': []}
    v = df['value'].values.tolist()
    p = df['pos'].values.tolist()
    t = sum(max(v)) // 1000
    T = t * 2 + 2 - t
    for vlst, plst in zip(v, p):
        res, N = [], []
        for x in vlst:
            if x >= 1000:
                res.extend((x/2, x/2))
                N.append(2)
            else:
                res.append(x)
                N.append(1)

        n = sum(N)
        if n < T: res.extend([0]*(T-n))
        d['value'].append(res)

        res = []
        for s, c in zip(plst, N):
            res.extend([s]*c)
        if n < T: res.extend(['nan']*(T-n))
        d['pos'].append(res)
    return pd.DataFrame(d)


data = {"pos":[["A1","A2"],
               ["B1","B2"]],
        "value"  :[[20,1000],
                 [20,50]]}
df = pd.DataFrame(data)
print(df, end='\n\n')

print(splitmax(df), end='\n\n')

data = {"pos":[["A1","A2"],
               ["B1","B2"],
               ["C1","C2"]],
        "value"  :[[20,1000],
                   [20,50],
                   [1000,1000]]}
df = pd.DataFrame(data)
print(df, end='\n\n')

print(splitmax(df), end='\n\n')
        pos       value
0  [A1, A2]  [20, 1000]
1  [B1, B2]    [20, 50]

             pos               value
0   [A1, A2, A2]  [20, 500.0, 500.0]
1  [B1, B2, nan]         [20, 50, 0]

        pos         value
0  [A1, A2]    [20, 1000]
1  [B1, B2]      [20, 50]
2  [C1, C2]  [1000, 1000]

                  pos                         value
0   [A1, A2, A2, nan]         [20, 500.0, 500.0, 0]
1  [B1, B2, nan, nan]                [20, 50, 0, 0]
2    [C1, C1, C2, C2]  [500.0, 500.0, 500.0, 500.0]
広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください