基于列筛选dataframe中的数据

2024-09-27 00:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

需要过滤dataframe中的数据并从中创建一行。我尝试按分组,但希望筛选不同的值,因此我未能这样做。这是一个例子

#1      #2      #3      #4
1       Bob     10      Eng
2       Jack    21      Tel
3       Rian    11      Tam
4       Vick    10      Ram
5       Jick    20      Mar
6       Rams    10      Mal
7       Venk    21      Mar

首先需要将列#3上的行过滤为10,然后是21

#1      #2      #3      #4
1       Bob     10      Eng
2       Jack    21      Tel
3       Rams    10      Mal
4       Venk    21      Mal

然后将这两行数据转换为一行,如下所示

#1      #2      #3      #4      #5
1       Bob     Jack    Eng     Tel
2       Jick    Venk    Mal     Mar

作为一名初学者,我尝试了几种方式进行分组,但需要选择的值是按顺序排列的,第一行应该包含10,直接行应该是21

有人能建议熊猫中的哪种API能帮助我实现这一点吗


Tags: 数据dataframeengmar例子malbobjack
3条回答

你是说像这样的事情吗

>>> x = df.loc[(df['#3'].eq(10) & df['#3'].shift(-1).eq(21)) | (df['#3'].shift().eq(10) & df['#3'].eq(21))]
>>> x.groupby(np.arange(len(x)) // 2).apply(lambda x: pd.DataFrame(x.drop(["#1", "#3"], axis=1).to_numpy().flatten()).T).reset_index(drop=True).rename(lambda x: f'#{x + 1}', axis=1)
     #1   #2    #3   #4
0   Bob  Eng  Jack  Tel
1  Rams  Mal  Venk  Mar
>>> 

如果21总是紧跟在10之后,您可能会喜欢:

df_shifted = df.shift(-1, axis=0)  # df is the original DataFrame you have.
is_ok = (df["#3"] == 10) & (df_shifted["#3"] == 21)
ans = pd.concat([df[is_ok], df_shifted[is_ok]], axis=1).drop(columns="#3")

这将返回:

  #2   #4  #2   #4
1 Bob  Eng Jack Tel
6 Rams Mal Venk Mar

尝试:

mask = df["#3"].eq(21) & df["#3"].shift().eq(10)
mask = mask.shift(-1).fillna(False) | mask
x = (
    df[mask]
    .groupby(np.arange(mask.sum()) // 2)
    .apply(lambda x: list(x["#2"]) + list(x["#4"]))
).apply(pd.Series)
x.columns = [f"#{x+2}" for x in x.columns]
x = x.reset_index().rename(columns={"index": "#1"})
x["#1"] += 1
print(x)

印刷品:

   #1    #2    #3   #4   #5
0   1   Bob  Jack  Eng  Tel
1   2  Rams  Venk  Mal  Mar

相关问题 更多 >

    热门问题