如何从 pandas DataFrame 行中删除空格,直到第一个填充字段?
How to delete empty spaces from pandas DataFrame rows until first populated field?
假设我从 PFD 导入了一个非常混乱的数据,然后我清理了它。我有这样的东西:
Name
Type
Date
other1
other2
other3
Name1
''
''
Type1
''
Date1
Name2
''
''
''
Type2
Date2
Name3
''
''
Type3
Date3
''
Name4
''
Type4
''
''
Date4
Name5
Type5
''
Date5
''
''
等等。如您所见,Type 始终在每一行的日期之前,但我基本上需要删除所有 ''(DataFrame 上当前为空字符串),同时将所有内容移至左侧,以便它们与各自的 Type 和 Date 列对齐。
此外,右边还有更多列有同样的问题,但由于结构原因我不能删除所有'',我正在寻找的解决方案只是移动 'everything to the left' 可以这么说(就像 pd.shift).
感谢您的帮助。
data = df.values.flatten()
pd.DataFrame(data[data != ""].reshape(-1, 3), columns = ['Name','Type', 'Date'])
或:
pd.DataFrame(df.values[df.values != ""].reshape(-1, 3), columns = ['Name','Type', 'Date'])
输出:
Name Type Date
0 Name1 Type1 Date1
1 Name2 Type2 Date2
2 Name3 Type3 Date3
3 Name4 Type4 Date4
4 Name5 Type5 Date5
没有重塑:
pd.DataFrame(df.apply(lambda x: (a:=np.array(x))[a != ""] , axis = 1).values.tolist())
或:
s = df[0].copy()
for col in df.columns[1:]:
s += " " + df[col]
pd.DataFrame(s.str.split().values.tolist(), columns = ['Name','Type', 'Date'])
对我有用的是:
while '' in df['Type'].unique():
for i,row in df.iterrows():
if row['Type'] == '':
df.iloc[i, 1:] = df.iloc[i, 1:].shift(-1, fill_value='')
下一栏也一样
假设我从 PFD 导入了一个非常混乱的数据,然后我清理了它。我有这样的东西:
Name | Type | Date | other1 | other2 | other3 |
---|---|---|---|---|---|
Name1 | '' | '' | Type1 | '' | Date1 |
Name2 | '' | '' | '' | Type2 | Date2 |
Name3 | '' | '' | Type3 | Date3 | '' |
Name4 | '' | Type4 | '' | '' | Date4 |
Name5 | Type5 | '' | Date5 | '' | '' |
等等。如您所见,Type 始终在每一行的日期之前,但我基本上需要删除所有 ''(DataFrame 上当前为空字符串),同时将所有内容移至左侧,以便它们与各自的 Type 和 Date 列对齐。 此外,右边还有更多列有同样的问题,但由于结构原因我不能删除所有'',我正在寻找的解决方案只是移动 'everything to the left' 可以这么说(就像 pd.shift).
感谢您的帮助。
data = df.values.flatten()
pd.DataFrame(data[data != ""].reshape(-1, 3), columns = ['Name','Type', 'Date'])
或:
pd.DataFrame(df.values[df.values != ""].reshape(-1, 3), columns = ['Name','Type', 'Date'])
输出:
Name Type Date
0 Name1 Type1 Date1
1 Name2 Type2 Date2
2 Name3 Type3 Date3
3 Name4 Type4 Date4
4 Name5 Type5 Date5
没有重塑:
pd.DataFrame(df.apply(lambda x: (a:=np.array(x))[a != ""] , axis = 1).values.tolist())
或:
s = df[0].copy()
for col in df.columns[1:]:
s += " " + df[col]
pd.DataFrame(s.str.split().values.tolist(), columns = ['Name','Type', 'Date'])
对我有用的是:
while '' in df['Type'].unique():
for i,row in df.iterrows():
if row['Type'] == '':
df.iloc[i, 1:] = df.iloc[i, 1:].shift(-1, fill_value='')
下一栏也一样