如果在 2 个单元格中满足 NaN 值和小写,则合并多行 pandas

Combine multiple row pandas if met NaN Values and lowercase in 2 cell

我的问题是我想让它们成为单行。但是,它只有在 Xlabel 中的行下遇到小写时才有条件。另一方面,多行被缩小,使 Ylabel 也只有 NaN 值被缩小

所以我有这样的数据框:

    Xlabel      Ylabel
  0 Baby doll   240.0
  1 Benet doll  30.0
  2 lingling    NaN
  3 Kurachaa    NaN
  4 mothers     NaN
  5 day         NaN
  6 Grape day   100.0
  7 holidays    NaN
  8 Halari doom 90.0
  9 Korsira ja  110.0
 10 Hujarata    940.0
 11 hoom hoom   NaN
 12 laka laka   NaN
 13 cherry      NaN
 

然后变得像

  xlabel                              Ylabel
0 Baby doll                           240.0
1 Benet doll lingling                 30.0
2 Kurachaa mothers day                NaN
3 Grape day holidays                  100.0
4 Halari doom                         90.0
5 Korsira ja                          110.0
6 Hujarata hoom hoom laka laka cherry 940.0

我怎样才能做到这一点?

我们可以使用 str.contains 检查第一个大写字母在列 Xlabel 的字符串中的出现,然后对该布尔掩码进行累加求和以确定属于同样的句子,最后在这些块上对数据帧进行分组,并使用 joinYlabel 使用 first

聚合列 Xlabel
b = df['Xlabel'].str.contains(r'^[A-Z]').cumsum()
df.groupby(b, as_index=False).agg({'Xlabel': ' '.join, 'Ylabel': 'first'})

                                Xlabel  Ylabel
0                            Baby doll   240.0
1                  Benet doll lingling    30.0
2                 Kurachaa mothers day     NaN
3                   Grape day holidays   100.0
4                          Halari doom    90.0
5                           Korsira ja   110.0
6  Hujarata hoom hoom laka laka cherry   940.0

最直接的方法是用for循环逐行遍历DataFrame,检查Xlabel是否以小写开头。例如:

import pandas as pd
import string
new_df = pd.DataFrame(columns=df.columns)
temp_df = pd.DataFrame(columns=df.columns)
for idx in range(len(df)):
    if df["Xlabel"][idx][0] in string.ascii_uppercase:
        temp_df = df.iloc[idx]
    else:
        # do something
        temp_df["Xlabel"] = temp_df["Xlabel"]+" "+df["Xlabel"][idx]
        new_df = new_df.append(temp_df)