如果在 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
的字符串中的出现,然后对该布尔掩码进行累加求和以确定属于同样的句子,最后在这些块上对数据帧进行分组,并使用 join
和 Ylabel
使用 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)
我的问题是我想让它们成为单行。但是,它只有在 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
的字符串中的出现,然后对该布尔掩码进行累加求和以确定属于同样的句子,最后在这些块上对数据帧进行分组,并使用 join
和 Ylabel
使用 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)