Python数据帧整形
我有一个python数据框架,可以简化如下:Python数据帧整形,python,pandas,dataframe,if-statement,Python,Pandas,Dataframe,If Statement,我有一个python数据框架,可以简化如下: python df= pd.DataFrame([['January','Monday',np.nan,np.nan,np.nan,1,20],['January','Monday',np.nan,np.nan,np.nan,2,25],['February','Monday',np.nan,np.nan,np.nan,1,15],\ ['February','Monday',np.nan,np.nan,np.nan,2,20],['Fe
python
df= pd.DataFrame([['January','Monday',np.nan,np.nan,np.nan,1,20],['January','Monday',np.nan,np.nan,np.nan,2,25],['February','Monday',np.nan,np.nan,np.nan,1,15],\
['February','Monday',np.nan,np.nan,np.nan,2,20],['February','Monday',np.nan,np.nan,np.nan,3,25],['March','Tuesday',np.nan,np.nan,np.nan,1,50],\
['March','Wednesday',np.nan,np.nan,np.nan,1,75]],columns = ['Month','Day','Data1','Data2', 'Data3','Count','Initial_Data'])
新数据框架的目的/目标:我希望按月份和日期对数据进行分类。我想用来自初始_数据的图填充列Data1、Data2和Data3。例如,对于一月和星期一,Data1=20,Data2=25,Data3保持为NaN,因为一月和星期一的计数最高=2。对于二月和星期一,我希望数据1=15,数据2=20和数据3=25,这是因为二月和星期一的计数最高=3。对于三月份的星期二,我希望Data1=50,Data2和Data3=NaN,对于三月份的星期三,我希望Data1=75和Data2=Data3=NaN,因为它们的最高计数为1。最终数据将如下所示:
Month Day Data1 Data2 Data3
0 January Monday 20 25.0 NaN
1 January Monday 20 25.0 NaN
2 February Monday 15 20.0 25.0
3 February Monday 15 20.0 25.0
4 February Monday 15 20.0 25.0
5 March Tuesday 50 NaN NaN
6 March Wednesday 75 NaN NaN
我尝试使用if语句,但它不起作用,因为我找不到填充所有三列(Data1、Data2和Data3)的解决方案。非常感谢。您可以尝试以下方法:
df2 = df.set_index(['Month','Day','Count'])['Initial_Data'].unstack().add_prefix('Data').reset_index()
df.merge(df2, on=['Month','Day'], suffixes=('_x',''))[df.columns]
输出:
Month Day Data1 Data2 Data3 Count Initial_Data
0 January Monday 20.0 25.0 NaN 1 20
1 January Monday 20.0 25.0 NaN 2 25
2 February Monday 15.0 20.0 25.0 1 15
3 February Monday 15.0 20.0 25.0 2 20
4 February Monday 15.0 20.0 25.0 3 25
5 March Tuesday 50.0 NaN NaN 1 50
6 March Wednesday 75.0 NaN NaN 1 75
详情:
首先,使用set_index
和unstack
最里面的索引移动到to列中的“Count”。从而重塑数据帧。然后将“数据”前缀添加到列标题
接下来,我们需要
合并
或根据月和日列将两个数据框连接在一起。这是我的答案,但Scott用了一个更好的答案击败了我
import numpy as np
import pandas as pd
df = pd.DataFrame([
['January','Monday',np.nan,np.nan,np.nan,1,20],\
['January','Monday',np.nan,np.nan,np.nan,2,25],\
['February','Monday',np.nan,np.nan,np.nan,1,15],\
['February','Monday',np.nan,np.nan,np.nan,2,20],\
['February','Monday',np.nan,np.nan,np.nan,3,25],\
['March','Tuesday',np.nan,np.nan,np.nan,1,50],\
['March','Wednesday',np.nan,np.nan,np.nan,1,75]],
columns = ['Month','Day','Data1','Data2', 'Data3','Count','Initial_Data'])
new = pd.DataFrame(columns = ['Month','Day','Data1','Data2', 'Data3'])
for ridx, row in df.iterrows():
new.loc[ridx] = [row['Month'], row['Day'], np.nan, np.nan, np.nan]
if row['Count'] == 1:
new.loc[new.index[ridx], 'Data1'] = row['Initial_Data']
if row['Count'] == 2:
new.loc[new.index[ridx], 'Data2'] = row['Initial_Data']
new.loc[new.index[ridx-1], 'Data2'] = row['Initial_Data']
new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
if row['Count'] == 3:
new.loc[new.index[ridx], 'Data3'] = row['Initial_Data']
new.loc[new.index[ridx-1], 'Data3'] = row['Initial_Data']
new.loc[new.index[ridx-2], 'Data3'] = row['Initial_Data']
new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
new.loc[new.index[ridx], 'Data2'] = new.loc[new.index[ridx-1], 'Data2']
print(new)
你能再解释一下这到底是怎么回事吗?@Ryan你最好把这句话一部分一部分地说出来,看看是怎么回事。如果你不是一个数据库人员,最难理解的部分是创建笛卡尔积的概念。使用
merge
方法在重复键上创建多个。我可以阅读/研究一下笛卡尔积的含义吗?我已经一步一步地运行了它,但这是我不太明白的路线。试试看
import numpy as np
import pandas as pd
df = pd.DataFrame([
['January','Monday',np.nan,np.nan,np.nan,1,20],\
['January','Monday',np.nan,np.nan,np.nan,2,25],\
['February','Monday',np.nan,np.nan,np.nan,1,15],\
['February','Monday',np.nan,np.nan,np.nan,2,20],\
['February','Monday',np.nan,np.nan,np.nan,3,25],\
['March','Tuesday',np.nan,np.nan,np.nan,1,50],\
['March','Wednesday',np.nan,np.nan,np.nan,1,75]],
columns = ['Month','Day','Data1','Data2', 'Data3','Count','Initial_Data'])
new = pd.DataFrame(columns = ['Month','Day','Data1','Data2', 'Data3'])
for ridx, row in df.iterrows():
new.loc[ridx] = [row['Month'], row['Day'], np.nan, np.nan, np.nan]
if row['Count'] == 1:
new.loc[new.index[ridx], 'Data1'] = row['Initial_Data']
if row['Count'] == 2:
new.loc[new.index[ridx], 'Data2'] = row['Initial_Data']
new.loc[new.index[ridx-1], 'Data2'] = row['Initial_Data']
new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
if row['Count'] == 3:
new.loc[new.index[ridx], 'Data3'] = row['Initial_Data']
new.loc[new.index[ridx-1], 'Data3'] = row['Initial_Data']
new.loc[new.index[ridx-2], 'Data3'] = row['Initial_Data']
new.loc[new.index[ridx], 'Data1'] = new.loc[new.index[ridx-1], 'Data1']
new.loc[new.index[ridx], 'Data2'] = new.loc[new.index[ridx-1], 'Data2']
print(new)
Month Day Data1 Data2 Data3
0 January Monday 20 25 NaN
1 January Monday 20 25 NaN
2 February Monday 15 20 25
3 February Monday 15 20 25
4 February Monday 15 20 25
5 March Tuesday 50 NaN NaN
6 March Wednesday 75 NaN NaN