【问题标题】:Create rows based on columns value根据列值创建行
【发布时间】:2020-07-28 15:44:04
【问题描述】:
+---+---+---+---+----+
| A | B | C | D | E  |
+---+---+---+---+----+
| 1 | 2 | 3 | 4 | VK |
| 1 | 4 | 6 | 9 | MD |
| 2 | 5 | 7 | 9 | V  |
| 2 | 3 | 5 | 8 | VK |
| 2 | 3 | 7 | 9 | V  |
| 1 | 1 | 1 | 1 | N  |
| 0 | 1 | 6 | 9 | V  |
| 1 | 2 | 5 | 7 | VK |
| 1 | 7 | 8 | 0 | MD |
| 1 | 5 | 7 | 9 | VK |
| 0 | 1 | 6 | 8 | V  |
+---+---+---+---+----+

我想根据列值创建行。例如,在给定的数据集中,我想根据“E”列值“VK”和“C”列的前两行选择行来创建新行。 A、B、D 列与第一个数据集无关。在这之后,我们应该得到一个这样的数据集:

    +---+---+---+----+
    | 7 | 6 | 3 | VK |
    | 1 | 7 | 5 | VK |
    | 7 | 8 | 5 | VK |
    +----------------+

【问题讨论】:

  • 你能把逻辑解释清楚一点吗?为什么行D 消失了?
  • 新行只需要来自 C 列和 E 列的值。新行应该从 E 列中获取一个值,从 C 列中获取 3 个值。 | 7 | 6 | 3 | VK |

标签: python pandas data-processing


【解决方案1】:

定义原始数据框,使用.tolist()提取C列的值,然后逆序列表切片准备目标行,最后创建一个新数据框并插入目标行:

import pandas as pd

df = pd.DataFrame([
[1, 2, 3, 4, "VK"],
[1, 4, 6, 9, "MD"],
[2, 5, 7, 9, "V"],
[2, 3, 5, 8, "VK"],
[2, 3, 7, 9, "V"],
[1, 1, 1, 1, "N"],
[0, 1, 6, 9, "V"],
[1, 2, 5, 7, "VK"],
[1, 7, 8, 0, "MD"],
[1, 5, 7, 9, "VK"],
[0, 1, 6, 8, "V"]
], columns=["A", "B", "C", "D", "E"]
)

col_c_list = df['C'].tolist()
row_1 = col_c_list[2::-1] + [df["E"][0]]
row_2 = col_c_list[5:2:-1] + [df["E"][0]]
row_3 = col_c_list[9:6:-1] + [df["E"][0]]

df = pd.DataFrame([
    row_1,
    row_2,
    row_3
], columns=["A", "B", "C", "D"]
)

print(df)

返回:

   A  B  C   D
0  7  6  3  VK
1  1  7  5  VK
2  7  8  5  VK

如果描述不那么模棱两可,我会推荐meltstack(参见https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.htmlhttps://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html

【讨论】:

  • 此过程是否使过程自动化?似乎这是一个手动解决方案。我的数据集中有 1000 多个样本,并且确实需要自动化过程。
  • 这可能有助于回答@Gustav Rasmussen stackoverflow.com/questions/63125523/…
猜你喜欢
  • 2020-10-24
  • 2021-02-28
  • 2022-11-17
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多