Python 基于列值创建行

Python 基于列值创建行,python,pandas,data-processing,Python,Pandas,Data Processing,我想基于列值创建行。例如,在给定的数据集中,我希望根据“E”列值“VK”和“C”列的前两行选择行以创建新行。A、 B、D列在第一个数据集上不相关。接下来,我们应该得到如下数据集: +---+---+---+---+----+ | 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 |

我想基于列值创建行。例如,在给定的数据集中,我希望根据“E”列值“VK”和“C”列的前两行选择行以创建新行。A、 B、D列在第一个数据集上不相关。接下来,我们应该得到如下数据集:

+---+---+---+---+----+
| 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  |
+---+---+---+---+----+

定义原始数据帧,使用
.tolist()
提取列C的值,然后按相反顺序列出切片以准备目标行,最后创建新数据帧并插入目标行:

    +---+---+---+----+
    | 7 | 6 | 3 | VK |
    | 1 | 7 | 5 | VK |
    | 7 | 8 | 5 | VK |
    +----------------+
返回:

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)

如果描述不那么模棱两可,我建议使用
melt
stack
(请参见和)

定义原始数据帧,使用
.tolist()
提取列C的值,然后按相反顺序列出切片以准备目标行,最后创建新数据帧并插入目标行:

    +---+---+---+----+
    | 7 | 6 | 3 | VK |
    | 1 | 7 | 5 | VK |
    | 7 | 8 | 5 | VK |
    +----------------+
返回:

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)

如果描述不那么模棱两可,我建议您选择
melt
stack
(请参见和)

您能更清楚地解释逻辑吗?为什么行
D
消失了?新行只需要C列和E列中的值。新行应该从E列中取一个值,从C列中取三个值你能更清楚地解释一下逻辑吗?为什么行
D
消失了?新行只需要C列和E列中的值。新行应该从E列中取一个值,从C列中取三个值7 | 6 | 3 | VK |此程序是否使流程自动化?似乎这是一个手动解决方案。我的数据集中有1000多个样本,确实需要一个自动化过程。这可能有助于回答@Gustav Rasmussen这个过程是否自动化了过程?似乎这是一个手动解决方案。我的数据集中有1000多个样本,确实需要一个自动化过程。这可能有助于回答@Gustav Rasmussen