簡體   English   中英

如何獲取1列值並根據布爾標志列將其中一些值放入新列?

[英]How do I take 1 column of values and put some of those values in a new column based on a boolean flag column?

說我有以下二維數據幀

+--------+-------------------+------------+
| Index, | Module/Line Item, | Is Module, |
+--------+-------------------+------------+
| 0,     | Module 1,         | True,      |
|--------|-------------------|------------|
| 1,     | Line Item 1,      | False,     |
|--------|-------------------|------------|
| 2,     | Line Item 2,      | False,     |
|--------|-------------------|------------|
| 3,     | Module 2,         | True,      |
|--------|-------------------|------------|
| 4,     | Line Item 1,      | False,     |
|--------|-------------------|------------|
| 5,     | Line Item 2,      | False      |
+--------+-------------------+------------+

我希望它變成這樣:

+----------+-------------+
| Module   | Line Item   |
+----------+-------------+
| Module 1 | Line Item 1 |
|          |-------------|
|          | Line Item 2 |
|----------|-------------|
| Module 2 | Line Item 1 |
|          |-------------|
|          | Line Item 2 |
+----------+-------------+

實現這一目標的最佳方法是什么? 我嘗試了pivot_table和groupby但是我無法按照我想要的方式工作。 請注意,模塊之間沒有一定數量的行項目,名稱中沒有模式。 “Is Module”列是唯一指示值是否為模塊且應該旋轉的指示符。 在模塊下方出現的所有行項目,直到下一個模塊在旋轉時應屬於該模塊。

如何轉動數據框無法解決這個問題,因為它從未解釋過如何根據另一列中給出的值將列拆分為層次結構。

使用where用於替換False的值Is Module通過正向充填,通過重命名列名和最后一個過濾器boolean indexingloc的過濾器也列名:

df['Module'] = df['Module/Line Item'].where(df['Is Module']).ffill()
df = df.rename(columns={'Module/Line Item':'Line Item'})
df = df.loc[~df['Is Module'], ['Module','Line Item']]
print (df)
     Module    Line Item
1  Module 1  Line Item 1
2  Module 1  Line Item 2
4  Module 2  Line Item 1
5  Module 2  Line Item 2

如果還需要使用空值替換Module重復值:

df['Module'] = df['Module'].mask(df['Module'].duplicated(), '')
print (df)
     Module    Line Item
1  Module 1  Line Item 1
2            Line Item 2
4  Module 2  Line Item 1
5            Line Item 2

另一種解決方案,使用groupby

df.groupby(df['Is Module'].cumsum())['Module/Line Item']\
.apply(lambda g: pd.DataFrame({'Module':g.iloc[0],
                               'Line Item': g.iloc[1:].values}))\
.set_index('Module')

            Line Item
Module  
Module 1    Line Item 1
            Line Item 2
Module 2    Line Item 1
            Line Item 2

暫無
暫無

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

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