我得走了

pd.DataFrame([["A1"     "B1",      "C1", "P"],
              ["A2"     "B2",      "C2", "P"],
              ["A3"     "B3",      "C3", "P"]], columns=["col_a"  "col_b",   "col_c", "col_d"])


col_a  col_b   col_c col_d
A1     B1      C1    P
A2     B2      C2    P
A3     B3      C3    P
...

我需要的结果基本上是重复,并确保每一行出现时,列在列中都有pqr扩展

col_a  col_b   col_c col_d
A1     B1      C1    P
A1     B1      C1    Q
A1     B1      C1    R

A2     B2      C2    P
A2     B2      C2    Q
A2     B2      C2    R

A3     B3      C3    P
A3     B3      C3    Q
A3     B3      C3    R
...

到目前为止,我只知道:

new_df = pd.DataFrame(np.repeat(df.values, 3, axis=0), columns=df.columns)

这会导致这些值的重复,但列d不变

编辑:

现在我偶然发现了另一个需求,对于每个独特的a列和b列,我需要在d列中添加"S"

例如,导致:

col_a  col_b   col_c col_d
A1     B1      C1    P
A1     B1      C1    Q
A1     B1      C1    R
A1     B1       T    S

A2     B2      C2    P
A2     B2      C2    Q
A2     B2      C2    R
A2     B2       T    S

非常感谢你的帮助!

推荐答案

将值添加到col_d x DataFrame.assignnumpy.tile列:

L = ['P','Q','R']
new_df = (pd.DataFrame(np.repeat(df.values, 3, axis=0), columns=df.columns)
           .assign(col_d = np.tile(L, len(df))))

print (new_df)
  col_acol_b col_c col_d
0       A1B1    C1     P
1       A1B1    C1     Q
2       A1B1    C1     R
3       A2B2    C2     P
4       A2B2    C2     Q
5       A2B2    C2     R
6       A3B3    C3     P
7       A3B3    C3     Q
8       A3B3    C3     R

另一个类似的 idea 是将索引和行重复DataFrame.loc次:

L = ['P','Q','R']
new_df = (df.loc[df.index.repeat(3)]
            .assign(col_d = np.tile(L, len(df)))
            .reset_index(drop=True))

print (new_df)
  col_acol_b col_c col_d
0       A1B1    C1     P
1       A1B1    C1     Q
2       A1B1    C1     R
3       A2B2    C2     P
4       A2B2    C2     Q
5       A2B2    C2     R
6       A3B3    C3     P
7       A3B3    C3     Q
8       A3B3    C3     R

编辑:

L = ['P','Q','R','S']
new_df = (pd.DataFrame(np.repeat(df.values, len(L), axis=0), columns=df.columns)
           .assign(col_d = np.tile(L, len(df)),
                   col_c = lambda x: x['col_c'].mask(x['col_d'].eq('S'), 'T')))

print (new_df)
   col_acol_b col_c col_d
0        A1B1    C1     P
1        A1B1    C1     Q
2        A1B1    C1     R
3        A1B1     T     S
4        A2B2    C2     P
5        A2B2    C2     Q
6        A2B2    C2     R
7        A2B2     T     S
8        A3B3    C3     P
9        A3B3    C3     Q
10       A3B3    C3     R
11       A3B3     T     S

Python相关问答推荐

如何检测背景有噪的图像中的正方形

需要计算60,000个坐标之间的距离

使可滚动框架在tkinter环境中看起来自然

如何获得每个组的时间戳差异?

如何在WSL2中更新Python到最新版本(3.12.2)?

如何在UserSerializer中添加显式字段?

Django RawSQL注释字段

在matplotlib中删除子图之间的间隙_mosaic

Maya Python脚本将纹理应用于所有对象,而不是选定对象

Pandas:计算中间时间条目的总时间增量

替换现有列名中的字符,而不创建新列

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

计算机找不到已安装的库'

使用polars. pivot()旋转一个框架(类似于R中的pivot_longer)

为什么Visual Studio Code说我的代码在使用Pandas concat函数后无法访问?

如何关联来自两个Pandas DataFrame列的列表项?

如何获取给定列中包含特定值的行号?

时间戳上的SOAP头签名无效

Groupby并在组内比较单独行上的两个时间戳

使用OpenPYXL切换图表上的行/列