Python 将唯一的列值转换为列名,并将所有相关的服务器名称置于其下
根据Python 将唯一的列值转换为列名,并将所有相关的服务器名称置于其下,python,python-3.x,pandas,Python,Python 3.x,Pandas,根据ENC1001和ENC1002 这只是两个ENC1001和ENC1002,但我有数百个 熊猫代码: 输出: 需要什么: 谢谢您的帮助。在数据帧中,同一行不同列的不同值之间存在一些关系。因此,我认为使用数据帧来获得您想要的并不是最好的方法 print(df.head(9)) Server Enclosure Hardware Bay Server Name 0 ENC1001 C7000 bay1 dpcfl1001.exa
ENC1001
和ENC1002
这只是两个ENC1001
和ENC1002
,但我有数百个
熊猫代码:
输出:
需要什么:
谢谢您的帮助。在数据帧中,同一行不同列的不同值之间存在一些关系。因此,我认为使用数据帧来获得您想要的并不是最好的方法
print(df.head(9))
Server Enclosure Hardware Bay Server Name
0 ENC1001 C7000 bay1 dpcfl1001.example.com
1 ENC1001 C7000 bay2 dpcfl1002.example.com
2 ENC1001 C7000 bay3 dpcfl1003.example.com
3 ENC1001 C7000 bay4 dpcfl1004.example.com
4 ENC1001 C7000 bay5 dpcfl1005.example.com
5 ENC1001 C7000 bay6 dpcfl1006.example.com
6 ENC1001 C7000 bay7 dpcfl1007.example.com
7 ENC1001 C7000 bay8 dpcfl1008.example.com
8 ENC1001 C7000 bay9 dpcfl1009.example.com
df2=df.groupby(['Server','Enclosure Hardware','Bay'])['Server Name'].apply(lambda x: pd.Series(x.tolist())).unstack('Server').fillna('None').reset_index().drop(columns=['level_2'])
Server Enclosure Hardware Bay ENC1001 ENC1002
0 C7000 bay1 dpcfl1001.example.com dpcfl1012.example.com
1 C7000 bay10 dpcfl1010.example.com None
2 C7000 bay11 dpcfl1011.example.com None
3 C7000 bay12 inc1001 None
4 C7000 bay13 inc1003 None
5 C7000 bay14 dpcfl2313.example.com None
6 C7000 bay15 lic1002 None
7 C7000 bay2 dpcfl1002.example.com dpcfl1013.example.com
8 C7000 bay3 dpcfl1003.example.com dpcfl1014.example.com
9 C7000 bay4 dpcfl1004.example.com dpcfl1015.example.com
10 C7000 bay5 dpcfl1005.example.com dpcfl1016.example.com
11 C7000 bay6 dpcfl1006.example.com dpcfl1017.example.com
12 C7000 bay7 dpcfl1007.example.com dpcfl1018.example.com
13 C7000 bay8 dpcfl1008.example.com None
14 C7000 bay9 dpcfl1009.example.com None
我建议使用字典,其中键是Server
,值是Server Name
,如下所示:
from collections import defaultdict
dd = defaultdict(list)
for name, group in df.groupby("Server"):
dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
'dpcfl2313.example.com' 'lic1002']
>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
'dpcfl1018.example.com']
现在,您可以打印服务器的所有服务器名称
,如下所示:
from collections import defaultdict
dd = defaultdict(list)
for name, group in df.groupby("Server"):
dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
'dpcfl2313.example.com' 'lic1002']
>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
'dpcfl1018.example.com']
如果要将其转换为pandas.DataFrame
,只需运行:
>>> new_df = pd.DataFrame.from_dict(dd, orient='index').T
ENC1001 ENC1002
0 dpcfl1001.example.com dpcfl1012.example.com
1 dpcfl1002.example.com dpcfl1013.example.com
2 dpcfl1003.example.com dpcfl1014.example.com
3 dpcfl1004.example.com dpcfl1015.example.com
4 dpcfl1005.example.com dpcfl1016.example.com
5 dpcfl1006.example.com dpcfl1017.example.com
6 dpcfl1007.example.com dpcfl1018.example.com
7 dpcfl1008.example.com None
8 dpcfl1009.example.com None
9 dpcfl1010.example.com None
10 dpcfl1011.example.com None
11 inc1001 None
12 inc1003 None
13 dpcfl2313.example.com None
14 lic1002 None
在数据帧中,同一行不同列的不同值之间存在一些关系。因此,我认为使用数据帧来获得您想要的并不是最好的方法
我建议使用字典,其中键是Server
,值是Server Name
,如下所示:
from collections import defaultdict
dd = defaultdict(list)
for name, group in df.groupby("Server"):
dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
'dpcfl2313.example.com' 'lic1002']
>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
'dpcfl1018.example.com']
现在,您可以打印服务器的所有服务器名称
,如下所示:
from collections import defaultdict
dd = defaultdict(list)
for name, group in df.groupby("Server"):
dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
'dpcfl2313.example.com' 'lic1002']
>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
'dpcfl1018.example.com']
如果要将其转换为pandas.DataFrame
,只需运行:
>>> new_df = pd.DataFrame.from_dict(dd, orient='index').T
ENC1001 ENC1002
0 dpcfl1001.example.com dpcfl1012.example.com
1 dpcfl1002.example.com dpcfl1013.example.com
2 dpcfl1003.example.com dpcfl1014.example.com
3 dpcfl1004.example.com dpcfl1015.example.com
4 dpcfl1005.example.com dpcfl1016.example.com
5 dpcfl1006.example.com dpcfl1017.example.com
6 dpcfl1007.example.com dpcfl1018.example.com
7 dpcfl1008.example.com None
8 dpcfl1009.example.com None
9 dpcfl1010.example.com None
10 dpcfl1011.example.com None
11 inc1001 None
12 inc1003 None
13 dpcfl2313.example.com None
14 lic1002 None
你可以这样做:
pd.concat([g.set_index('Bay').add_suffix(f'_{n}') for n, g in df.groupby('Server')],
axis=1, sort=False).filter(like='Server Name')
输出:
Server Name_ENC1001 Server Name_ENC1002
bay 1 dpcfl1001.example.com dpcfl1012.example.com
bay 2 dpcfl1002.example.com dpcfl1013.example.com
bay 3 dpcfl1003.example.com dpcfl1014.example.com
bay 4 dpcfl1004.example.com dpcfl1015.example.com
bay 5 dpcfl1005.example.com dpcfl1016.example.com
bay 6 dpcfl1006.example.com dpcfl1017.example.com
bay 7 dpcfl1007.example.com dpcfl1018.example.com
bay 8 dpcfl1008.example.com NaN
bay 9 dpcfl1009.example.com NaN
bay 10 dpcfl1010.example.com NaN
bay 11 dpcfl1011.example.com NaN
bay 12 inc1001 NaN
bay 13 inc1003 NaN
bay 14 dpcfl2313.example.com NaN
bay 15 lic1002 NaN
你可以这样做:
pd.concat([g.set_index('Bay').add_suffix(f'_{n}') for n, g in df.groupby('Server')],
axis=1, sort=False).filter(like='Server Name')
输出:
Server Name_ENC1001 Server Name_ENC1002
bay 1 dpcfl1001.example.com dpcfl1012.example.com
bay 2 dpcfl1002.example.com dpcfl1013.example.com
bay 3 dpcfl1003.example.com dpcfl1014.example.com
bay 4 dpcfl1004.example.com dpcfl1015.example.com
bay 5 dpcfl1005.example.com dpcfl1016.example.com
bay 6 dpcfl1006.example.com dpcfl1017.example.com
bay 7 dpcfl1007.example.com dpcfl1018.example.com
bay 8 dpcfl1008.example.com NaN
bay 9 dpcfl1009.example.com NaN
bay 10 dpcfl1010.example.com NaN
bay 11 dpcfl1011.example.com NaN
bay 12 inc1001 NaN
bay 13 inc1003 NaN
bay 14 dpcfl2313.example.com NaN
bay 15 lic1002 NaN
尝试:df.pivot(columns=“Server”,values=“Server Name”)
尝试:df.pivot(columns=“Server”,values=“Server Name”)
感谢您的回答+1,共有四个列名Server
,Enclosure Hardware
,Bay
和Server Name
,我想我们需要通过服务器?查看我的编辑。希望我的专栏是对的。我把头像印出来让你看。我使用的是df=pd.read_clipboard(),这可能会扭曲列答案+1,有四个列名称Server
,Enclosure Hardware
,Bay
和Server Name
,我想我们需要通过Server
查看我的编辑。希望我的专栏是对的。我把头像印出来让你看。我使用的是df=pd.read_clipboard(),这可能会扭曲答案Anwarvic+1的列签名,但我希望所有内容都能自行排序,而不是手动选择。对不起,我不知道你的意思。我的意思是格式将与文章中所需的输出相同。我已编辑了我的答案。。。希望这就是你的意思:)谢谢Anwarvic+1的答案,但我希望它能自动排序,而不是手动选择。对不起,我不知道你的意思。我的意思是格式将与文章中所需的输出相同。我已经编辑了我的答案。。。希望这就是你的意思:)谢谢Scott+1,这是另一种很好的方式。这是一个最好的选择,也是最合适的,正如我看到的机架号一样。@user294110谢谢。快乐编码!您正在为每一列添加后缀,后缀为服务器,然后使用“axis=1”并排连接所有这些组,最后,使用筛选器仅选择以“Server Name”开头的列。@krock1516请尝试:pd.concat([g.set_index('Bay')['Server Name'])。在df.groupby('Server')中为n,g重命名(f'{n})],axis=1,sort=False)
谢谢Scott+1,这是另一种很好的解决方法。这是一个最好的选择,也是最合适的,因为我看到了机架号。@user294110谢谢。快乐编码!您正在为每一列添加后缀,后缀为服务器,然后使用“axis=1”并排连接所有这些组,最后,使用筛选器仅选择以“Server Name”开头的列。@krock1516请尝试:pd.concat([g.set_index('Bay')['Server Name'])。在df.groupby('Server')中为n,g重命名(f'{n})],轴=1,排序=False)