簡體   English   中英

Pandas dataframe:根據其他列的數據創建新列

[英]Pandas dataframe: Creating a new column based on data from other columns

我有一個 pandas dataframe, df

   foo         bar
0  Supplies   Sample X
1  xyz        A   
2  xyz        B
3  Supplies   Sample Y
4  xyz        C
5  Supplies   Sample Z
6  xyz        D
7  xyz        E
8  xyz        F

我想創建一個看起來像這樣的新 df:

   bar
0  Sample X - A
1  Sample X - B
2  Sample Y - C
3  Sample Z - D
4  Sample Z - E
5  Sample Z - F

我是 Pandas 的新手,所以我不知道如何實現。 有人可以幫忙嗎?

我試過DataFrame.iterrows但沒有運氣。

您可以使用boolean 索引ffill

m = df['foo'].ne('Supplies')

out = (df['bar'].mask(m).ffill()[m]
       .add(' - '+df.loc[m, 'bar'])
       .to_frame().reset_index(drop=True)
       )

Output:

            bar
0  Sample X - A
1  Sample X - B
2  Sample Y - C
3  Sample Z - D
4  Sample Z - E
5  Sample Z - F

你可以做:

s = (df["bar"].mask(df.foo == "xyz").ffill() + "-" + df["bar"]).reindex(
    df.loc[df.foo == "xyz"].index
)

df = s.to_frame()

打印(df):

           bar
1   Sample X-A
2   Sample X-B
4   Sample Y-C
6   Sample Z-D
7   Sample Z-E
8   Sample Z-F

另一種可能的解決方案:

g = df.groupby(np.cumsum(df.bar.str.startswith('Sample')))
pd.DataFrame([x[1].bar.values[0] + ' - ' +
             y for x in g for y in x[1].bar.values[1:]], columns=['bar'])

Output:

            bar
0  Sample X - A
1  Sample X - B
2  Sample Y - C
3  Sample Z - D
4  Sample Z - E
5  Sample Z - F

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM